当前位置: 首页 > news >正文

Node.js开发-fs模块

这里写目录标题

  • fs模块
    • 1) 文件写入
    • 2) 文件写入
    • 3) 文件移动与重命名
    • 4) 文件删除
    • 5) 文件夹操作
    • 6) 查看资源状态
    • 7) 相对路径问题
    • 8) __dirname

fs模块

fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动等,还有文件内容的写入、读取,以及文件夹的相关操作

1) 文件写入

文件写入就是将 数据 保存到 文件 中,可以使用如下几个方法来实现该效果

方法说明
writeFile异步写入
writeFileSync同步写入
appendFile / appendFileSync追加写入
createWriteStream流式写入

writeFile 异步写入

语法 fs.writeFile(file, data[, options], callback)

参数说明:

  • file 文件名
  • data 待写入的数据
  • options 选项设置 (可选)
  • callback 写入回调

返回值: undefined

/*** 需要:* 新建一个文件:座右铭.txt* 写入内容:三人行,则必有我师焉*/
// 1.导入fs模块
const fs = require('fs')// 2.写入文件
fs.writeFile('./座右铭.txt', "三人行,则必有我师焉", err => {// err 写入失败:错误对象, 写入成功:nullif (err) {console.log("写入失败");return;} else {console.log("写入成功");}
});

writeFileSync 同步写入

语法: fs.writeFileSync(file, data[, options])

参数与 fs.writeFile 大体一致,只是没有 callback 参数

返回值: undefined

try{fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
}catch(e){console.log(e);
}

appendFile / appendFileSync 追加写入

appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同

语法:

  • fs.appendFile(file, data[, options], callback)
  • fs.appendFileSync(file, data[, options])

返回值: 二者都为 undefined

// 2.调用appendFile
fs.appendFile("./座右铭.txt", "\r\n择其善者而从之,。。。。", err=>{if (err) {console.log("写入失败");return;} else {console.log("写入成功");}
});// 2.调用appendFileSync
fs.appendFileSync("./座右铭.txt", "\r\n温故而知新。。。")// 2.调用writeFile(追加或覆盖)
fs.writeFile("./座右铭.txt", "love love",{flag:'a'} ,err=>{if (err) {console.log("写入失败");return;} else {console.log("写入成功");}
});

createWriteStream 流式写入

语法: fs.createWriteStream(path[, options])

参数说明:

  • path 文件路径
  • options 选项配置( 可选 )

返回值: Object

/*** 观书有感.txt*/// 1.导入fs模块
const fs = require("fs");// 2.创建写入流对象
const ws = fs.createWriteStream("./观书有感.txt");// 3.write
ws.write("半亩方塘一鉴开\r\n");
ws.write("天光运功徘徊\r\n");// 4.关闭通道
ws.close();

程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。

流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景

写入文件的场景

文件写入 在计算机中是一个非常常见的操作,下面的场景都用到了文件写入

  • 下载文件
  • 安装软件
  • 保存程序日志,如 Git
  • 编辑器保存文件
  • 视频录制

需要持久化保存数据 的时候,应该想到 文件写入

2) 文件写入

文件读取顾名思义,就是通过程序从文件中取出其中的数据,可以使用如下几种方式:

方法说明
readFile异步读取
readFileSync同步读取
createReadStream流式读取

readFile 异步读取

语法: fs.readFile(path[, options], callback)

参数说明:

  • path 文件路径
  • options 选项配置
  • callback 回调函数

返回值: undefined

// 1.引入fs模块
const fs = require("fs")// 2.异步读取
fs.readFile("./观书有感.txt", (err, data) => {if (err) {console.log("读取失败");return;}console.log(data.toString());
});

readFileSync 同步读取

语法: fs.readFileSync(path[, options])

参数说明:

  • path 文件路径
  • options 选项配置

返回值: string | Buffer

// 1.引入fs模块
const fs = require("fs")// 2.同步读取
let data = fs.readFileSync("./观书有感.txt");
console.log(data.toString());

createReadStream 流式读取

语法: fs.createReadStream(path[, options])

参数说明:

  • path 文件路径

返回值: Object

// 1.引入fs模块
const fs = require("fs");// 2.读取流对象
const rs = fs.createReadStream("./观书有感.txt");// 3.绑定data事件
rs.on("data", chunk => {console.log(chunk);
});// 4.end
rs.on("end", () => {console.log("读取完成");
});

每次取出 64k 数据后执行一次 data 回调

读取完毕后, 执行 end 回调

读取文件应用场景

  • 电脑开机

  • 程序运行

  • 编辑器打开文件

  • 查看图片

  • 播放视频

  • 播放音乐

  • Git 查看日志

  • 上传文件

  • 查看聊天记录

3) 文件移动与重命名

在 Node.js 中,我们可以使用 renamerenameSync 来移动或重命名 文件或文件夹

语法:

fs.rename(oldPath, newPath, callback)

fs.renameSync(oldPath, newPath)

参数说明:

  • oldPath 文件当前的路径

  • newPath 文件新的路径

  • callback 操作后的回调

// 1.导入fs模块
const fs = require("fs")// 2.调用rename方法
fs.rename("./座右铭.txt", "./我的新座右铭.txt", err => {if (err) {console.log("操作失败");return;}console.log("操作成功");
});

4) 文件删除

在 Node.js 中,我们可以使用 unlinkunlinkSync 来删除文件

语法:

  • fs.unlink(path, callback)

  • fs.unlinkSync(path)

参数说明:

  • path 文件路径

  • callback 操作后的回调

// 1.导入fs模块
const fs = require("fs")// 2.调用 unlink 方法 unlinkSync
fs.unlink("./观书有感.txt", err => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// 2.调用 rm 方法 rmSync
fs.rm("./data.txt", err => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});

5) 文件夹操作

借助 Node.js 的能力,我们可以对文件夹进行 创建 、 读取 、 删除 等操作

方法说明
mkdir / mkdirSync创建文件夹
readdir / readdirSync读取文件夹
rmdir / rmdirSync删除文件夹

mkdir 创建文件夹

在 Node.js 中,我们可以使用 mkdir 或 mkdirSync 来创建文件夹

语法:

  • fs.mkdir(path[, options], callback)

  • fs.mkdirSync(path[, options])

参数说明:

  • path 文件夹路径

  • options 选项配置( 可选 )

  • callback 操作后的回调

// 1.导入fs模块
const fs = require("fs")// 2-1.创建文件夹
fs.mkdir("./html", err => {if (err) {console.log("创建失败");return;}console.log("创建成功");
});// 2-2.递归创建
fs.mkdir("./a/b/c", {recursive: true}, err => {if (err) {console.log("创建失败");return;}console.log("创建成功");
});

readdir 读取文件夹

在 Node.js 中,我们可以使用 readdirreaddirSync 来读取文件夹

语法:

  • fs.readdir(path[, options], callback)

  • fs.readdirSync(path[, options])

参数说明:

  • path 文件夹路径

  • options 选项配置( 可选 )

  • callback 操作后的回调

// 2-3 读取文件夹
fs.readdir("./", (err, data) => {if (err) {console.log("读取失败");return;}console.log("读取成功"+data);
});

rmdir 删除文件夹

在 Node.js 中,我们可以使用 rmdirrmdirSync 来删除文件夹

语法:

  • fs.rmdir(path[, options], callback)

  • fs.rmdirSync(path[, options])

参数说明:

  • path 文件夹路径

  • options 选项配置( 可选 )

  • callback 操作后的回调

// 2-4 删除文件夹
fs.rmdir("./html", err => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// 递归删除-不推荐使用
fs.rmdir("./a", {recursive: true}, err => {if (err) {console.log("删除失败"+err);return;}console.log("删除成功");
});// 递归删除-推荐使用
fs.rm("./a", {recursive: true}, err => {if (err) {console.log("删除失败"+err);return;}console.log("删除成功");
});

6) 查看资源状态

在 Node.js 中,我们可以使用 statstatSync 来查看资源的详细信息

语法:

  • fs.stat(path[, options], callback)

  • fs.statSync(path[, options])

参数说明:

  • path 文件夹路径

  • options 选项配置( 可选 )

  • callback 操作后的回调

// 1.导入fs模块
const fs = require("fs");// 2.调用 stat
fs.stat("./1-文件写入.js", (err, data) => {if (err) {console.log("操作失败");return;}console.log(data);console.log(data.isFile());console.log(data.isDirectory());
});

7) 相对路径问题

fs 模块对资源进行操作时,路径的写法有两种:

  • 相对路径

    • ./座右铭.txt 当前目录下的座右铭.txt
    • 座右铭.txt 等效于上面的写法
    • ../座右铭.txt 当前目录的上一级目录中的座右铭.txt
  • 绝对路径

    • D:/Program Files windows 系统下的绝对路径
    • /usr/bin Linux 系统下的绝对路径

相对路径中所谓的 当前目录 ,指的是 命令行的工作目录 ,而并非是文件的所在目录

所以当命令行的工作目录与文件所在目录不一致时,会出现一些 BUG

8) __dirname

__dirnamerequire 类似,都是 Node.js 环境中的’全局’变量

__dirname 保存着 当前文件所在目录的绝对路径 ,可以使用 __dirname 与文件名拼接成绝对路径

代码示例:

let data = fs.readFileSync(__dirname + '/data.txt');
console.log(data);

使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的Bug

相关文章:

Node.js开发-fs模块

这里写目录标题 fs模块1) 文件写入2) 文件写入3) 文件移动与重命名4) 文件删除5) 文件夹操作6) 查看资源状态7) 相对路径问题8) __dirname fs模块 fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动等,还有文件内容的写入、读取&#xff…...

探索Nginx:强大的开源Web服务器与反向代理

一、引言 随着互联网的飞速发展,Web服务器在现代技术架构中扮演着至关重要的角色。Nginx(发音为“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx因其卓越的性能、稳定性和灵活性&…...

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

【从Python基础到深度学习】1. Python PyCharm安装及激活

前言: 为了帮助大家快速入门机器学习-深度学习,从今天起我将用100天的时间将大学本科期间的所学所想分享给大家,和大家共同进步。【从Python基础到深度学习】系列博客中我将从python基础开始通过知识和代码实践结合的方式进行知识的分享和记…...

片上网络NoC(3)——拓扑指标

目录 一、概述 二、指标 2.1 与网络流量无关的指标 2.1.1 度(degree) 2.1.2 对分带宽(bisection bandwidth) 2.1.3 网络直径(diameter) 2.2 与网络流量相关的指标 2.2.1 跳数(hop coun…...

二叉树 ---- 所有结点数

普通二叉树的结点数: 递归法: 对二叉树进行前序or后序遍历: typedef struct Tree {int data;Tree* leftChild;Tree* rightChild; }tree,*linklist; //计算普通二叉树的结点数 int nodenums(linklist node) {if(node nullptr) return 0; …...

步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储

博客原文 文章目录 前言集群环境nfs 环境搭建pod 挂载 nfs架构图 pvc 方式挂载 nfs架构图 storageclass 方式动态申请 pv架构图 参考 前言 持久化卷(Persistent Volume, PV)允许用户将外部存储映射到集群,而持久化卷申请(Persist…...

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十...

Modelsim10.4安装

简介(了解,可跳过) modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速…...

Java基于微信小程序的医院核酸检测服务系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

VC++ 绘制折线学习

win32 有三个绘制折线的函数; Polyline,根据给定点数组绘制折线; PolylineTo,除了绘制也更新当前位置; PolyPolyline,绘制多条折线,第一个参数是点数组,第二个参数是一个数组、指…...

速盾:dns解析和cdn加速的区别与联系

DNS解析和CDN加速是两种不同的网络技术,但在网站访问过程中起到了相互协作的作用。 首先,DNS解析(Domain Name System)是将域名转换为IP地址的过程。当用户输入一个网址时,计算机会先向本地DNS服务器发送一个查询请求…...

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(3) 保存表格数据

对上两篇篇的工作C Qt框架开发| 基于Qt框架开发实时成绩显示排序系统(1)-CSDN博客和C Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示-CSDN博客继续优化,增加一个保存按钮,用于保存成绩数据…...

ChatGPT 4:新特性与优势

ChatGPT 4:新特性与优势 一、引言 ChatGPT 4是一款备受瞩目的人工智能模型,它以其强大的语言生成能力和智能回答能力,为用户提供了更高效、更便捷的对话体验。为了能够充分享受ChatGPT 4的各项功能,本文将向您详细介绍其新特性&…...

【教程】MySQL数据库学习笔记(二)——数据类型(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 文章目录 【MySQL数据库学习】系列文章一、整…...

Servo的并发模型介绍

Servo是一个由Mozilla Research开发的实验性浏览器引擎,旨在为未来的网页和应用程序提供高性能的渲染。Servo的并发模型是其核心特点之一,它利用现代多核处理器的优势,通过异步编程和并行处理来提高渲染效率和响应性。以下是对Servo并发模型的…...

Vue3大事件项目(ing)

文章目录 核心内容1.大事件项目介绍2.大事件项目创建3.Eslint配置代码风格4.配置代码检查工作流问题: pnpm lint是全量检查,耗时问题,历史问题 5.目录调整6.vue-router4 路由代码解析7.引入 Element Plus 组件库8.Pinia 构建仓库 和 持久化9.Pinia 仓库统一管理 核心内容 Vue3…...

基于spring boot实现邮箱发送和邮箱验证

目录 一、邮箱发送实现1. 开通邮箱服务2. 添加邮箱依赖3.添加配置4.添加邮箱通用类5. 测试类 二、邮箱验证实现1.添加依赖2. 添加配置3.添加controller4. 测试 项目地址: https://gitee.com/nssnail/springboot-email 一、邮箱发送实现 1. 开通邮箱服务 使用qq邮箱、163邮箱都…...

华清作业day56

SQLite特性: 零配置一无需安装和管理配置;储存在单一磁盘文件中的一个完整的数据库;数据库文件可以在不同字节顺序的机器间自由共享;支持数据库大小至2TB;足够小,全部源码大致3万行c代码,250KB…...

【FPGA】VHDL:八段码到8421BCD码转换电路

目录 EDA设计基础练习题 : 实验要求如下: 代码 八段码到8421BCD码转换电路 8421BCD码到八段码转换电路 八段码到8421BCD~运行结果展示 8421BCD转八段码~运行结果展示 特别注意 软件:Quartus II 13.0 (64-bit) 语言:VHDL E…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...