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

Node.js中的fs模块:文件与目录操作(写入、读取、复制、移动、删除、重命名等)

在Node.js中,fs模块提供了多种方法来处理文件和目录操作,使得数据的持久性保存和文件管理变得简单。下面将介绍文件读写、文件复制、文件移动、文件重命名、文件删除、文件夹创建与删除以及查看资源状态等常用操作。

首先,在使用写入和读取功能前,我们需要导入fs模块,这是所有文件操作的基础:

const fs = require("fs");

一、文件写入

1. 异步写入

使用fs.writeFile方法异步写入文件。例如,写入一个三字经文件:

fs.writeFile("./三字经.txt", "人之初,性本善。", (err) => {if (err) {console.log("写入失败");return;}console.log("写入成功");
});
console.log("异步写入操作已发起");

注意console.log("异步写入操作已发起"); 会在 writeFile 回调之前执行,因为 writeFile 是异步的。

2. 同步写入

如果需要同步执行,可以使用fs.writeFileSync方法:

try {fs.writeFileSync("./data.txt", "text");console.log("同步写入成功");
} catch (err) {console.error("同步写入错误:", err);
}
console.log("同步写入操作已完成");

这里的console.log("同步写入操作已完成");会在writeFile回调之后执行,因为writeFileSync是同步的。

3. 异步追加写入

使用fs.appendFile方法可以异步追加内容到文件末尾:

fs.appendFile("./三字经.txt", "性相近,习相远。", (err) => {if (err) {console.log("追加失败");return;}console.log("追加成功");
});
4、同步追加写入

同样,fs.appendFileSync方法用于同步追加写入:

try {fs.appendFileSync("./data.txt", "\r\n追加text");console.log("同步追加成功");
} catch (err) {console.error("同步追加错误:", err);
}
5. 使用fs.writeFile实现追加写入

通过设置flag: 'a'选项,fs.writeFile也可以用于追加写入:

fs.writeFile("./三字经.txt", "\r\n苟不教,父之过。", { flag: 'a' }, (err) => {if (err) {console.error("追加写入失败:", err);return;}console.log("追加写入成功");
});
6. 流式写入

对于大文件或需要持续写入的数据,使用流(stream)是一个更好的选择。使用fs.createWriteStream创建一个写入流并写入数据:

const ws = fs.createWriteStream('./静夜思.txt');ws.write('窗前明月光,\r\n'); 
ws.write("疑是地上霜。\r\n");
ws.write("举头望明月,\r\n"); 
ws.write("低头思故乡。\r\n"); // 关闭流,确保数据完全写入文件ws.end(() => {console.log("流式写入完成");
});
//ws.close()

通常不需要显式调用ws.close()来关闭写入流,因为close方法不会等待数据被刷新到磁盘,可能会导致数据未完全写入文件。

可以使用ws.end(),它会在数据写入完成后自动关闭流,确保数据完全写入文件。。

二、文件读取

1、异步读取

使用fs.readFile方法可以异步读取文件内容。异步读取不会阻塞事件循环,这对于需要处理大量I/O操作的Node.js应用至关重要:

// 异步读取 radFile(这里以 "三字经.txt" 为例)
fs.readFile("./三字经.txt", (err, data) => {if (err) {console.log("读取失败");return;}console.log(data.toString());
});

2、同步读取

使用fs.readFileSync方法可以实现文件的同步读取。但请注意,同步读取会阻塞事件循环,直到文件读取完成。因此,在实际应用中,尤其是服务器应用中,通常不推荐使用同步读取:

// 同步读取 radFileSync(这里以 "三字经.txt" 为例)let data = fs.readFileSync("./三字经.txt");console.log(data.toString());

3、流式读取

流式读取更加灵活高效,它可以逐块读取文件内容,而不是一次性将整个文件加载到内存中。这对于处理大文件非常有用

使用 fs.createReadStream 方法可以创建一个可读流。

// 流式读取 createReadStream(这里以 "三字经.txt" 为例)
const rs = fs.createReadStream('./三字经.txt');// 绑定data事件,每次读取到数据块时触发
rs.on('data', chunk => {console.log(chunk);// chunk 是一个 Buffer 对象,代表读取到的数据块// 处理文本文件时,可将Buffer对象转换为字符串:chunk.toString()
});// 绑定end事件,读取完成时触发
rs.on('end', () => {console.log("读取完成");
});// 绑定error事件,读取过程中发生错误时触发
rs.on('error', err => {console.error("读取错误:", err);
});

建议至少绑定 error 事件来避免未捕获的异常导致程序崩溃

三、文件复制

文件复制可以通过读取源文件内容并写入到目标文件来实现,也可以使用流来更高效地处理大文件。

1、同步复制

// 读取文件内容
let data = fs.readFileSync("./三字经.txt");
// 写入文件
fs.writeFileSync("./复制三字经.txt", data)

2、流式操作

占用内存空间更小,使用流更高效处理大文件

// 创建读取流对象
const rs = fs.createReadStream('./三字经.txt')
// 创建写入流对象
const ws = fs.createWriteStream('./复制三字经2.txt');
// // 绑定data事件
rs.on('data', chunk => {ws.write(chunk)
})// 或者使用 pipe() 方法const rs2 = fs.createReadStream('./三字经.txt');
const ws2 = fs.createWriteStream('./复制三字经3.txt');
rs2.pipe(ws2);

四、文件移动与重命名

使用fs.renamefs.renameSync方法可以实现文件的移动和重命名。

1、异步操作

fs.rename("oldname.txt", "newname.txt", (err) => {if (err) {console.log("重命名失败");return;}console.log("重命名成功");
});fs.rename("path/to/oldfile.txt", "path/to/newfolder/newfile.txt", (err) => {if (err) {console.log("移动失败");return;}console.log("移动成功");
});

2、同步操作

fs.renameSync("oldname.txt", "newname.txt");fs.renameSync("path/to/oldfile.txt", "path/to/newfolder/newfile.txt");

五、文件删除

使用fs.unlink/fs.unlinkSyncfs.rm/fs.rmSync方法删除文件。

1、异步操作

fs.unlink("file.txt", (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// Node.js 14.14.0及以上版本可以使用fs.rmfs.rm("file.txt", (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});

2、同步操作

fs.unlinkSync("file.txt");fs.rmSync("file.txt");

六、查看资源状态

使用fs.statfs.statSync方法查看文件或目录的状态。

1、异步操作

fs.stat("file.txt", (err, stats) => {if (err) {console.log("获取状态失败");return;}console.log("操作成功", stats);// 资源状态console.log(stats.isFile()); // 是否为文件console.log(stats.isDirectory()); // 是否为目录
});

2、同步操作

const stats = fs.statSync("file.txt");

七、文件夹操作

1、创建文件夹

使用fs.mkdirfs.mkdirSync方法创建文件夹,{ recursive: true }用于递归创建:

fs.mkdir("newfolder", { recursive: true }, (err) => {if (err) {console.log("创建失败");return;}console.log("创建成功");
});fs.mkdirSync("newfolderSync", { recursive: true });

2、读取文件夹

使用fs.readdirfs.readdirSync方法读取文件夹内容。

fs.readdir("folder", (err, files) => {if (err) {console.log("读取失败");return;}console.log(files);
});const filesSync = fs.readdirSync("folder");
console.log(filesSync);

3、删除文件夹

使用fs.rmdirfs.rm方法删除文件夹,{ recursive: true, force: true }用于递归强制删除:

fs.rmdir("folder", { recursive: true }, (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// Node.js 14.14.0及以上版本fs.rm("folder", { recursive: true, force: true }, (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});

相关文章:

Node.js中的fs模块:文件与目录操作(写入、读取、复制、移动、删除、重命名等)

在Node.js中,fs模块提供了多种方法来处理文件和目录操作,使得数据的持久性保存和文件管理变得简单。下面将介绍文件读写、文件复制、文件移动、文件重命名、文件删除、文件夹创建与删除以及查看资源状态等常用操作。 首先,在使用写入和读取功…...

代码的形状:重构的方向

大概2周前写了一篇《代码的形状:从外到内的探索与实践》 涵树:代码的形状:从外到内的探索与实践 觉得这个话题还可以继续,它是一个从无形到有形的过程,而这个过程感觉就是王阳明先生说的“心即理”的探寻过程。 我讨论代码的形状&#xff…...

2021 年 3 月青少年软编等考 C 语言五级真题解析

目录 T1. 红与黑思路分析T2. 密室逃脱思路分析T3. 求逆序对数思路分析T4. 最小新整数思路分析T1. 红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的…...

华为C语言编程规范总结

1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译,会增加大量编译工作量,延长编译时间,因此: 1.1 头文件里尽量少包含头文件 1.2 头文件应向稳定的方向包含 2.每一个.c文件应有一个同名.h文件&#xff0c…...

XML 解析器:深入解析与高效应用

XML 解析器:深入解析与高效应用 引言 XML(可扩展标记语言)作为一种重要的数据交换格式,被广泛应用于各种系统和平台中。为了有效地处理和解析XML数据,XML解析器发挥着至关重要的作用。本文将深入探讨XML解析器的原理…...

《系统爆破:MD5易破,后台登录可爆破?》

声明:笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 爆破Sales系统 一、爆破MD5 场景:已知MD5的加密字符串,如何得知明…...

基于微信小程序的书籍销售系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

SpringData-Redis缓存

Spring Framework是领先的全堆栈Java/JEE应用程序框架。它提供了一个轻量级容器和一个通过使用依赖注入、AOP和可移植服务抽象实现的非侵入性编程模型。 NoSQL存储系统为传统RDBMS提供了一种横向可扩展性和速度的替代方案。就实现而言,键值存储代表NoSQL空间中最大…...

Hadoop3.3.4伪分布式环境搭建

文章目录 前言一、准备1. 下载Hadoop2. 配置环境变量3. 配置免密 二、Hadoop配置1. hadoop-env.sh2. hdfs-site.xml3. core-site.xml4. mapred-site.xml5. yarn-site.xml 三、格式化四、启动 前言 hadoop学习——伪分布式环境——普通用户搭建 一、准备 1. 下载Hadoop 2. 配…...

【VUE 指令学习笔记】

v-bind :单向绑定解析表达式,可简写为:xxx v-model :双向数据绑定。 v-for:遍历数组/对象/字符串 v-on:绑定事件监听,可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…...

【深度学习】布匹寻边:抓边误差小于3px【附完整链接】

布匹寻边 项目简介 布匹寻边是指布料裁剪过程中,通过AI寻边技术自动识别布匹的边缘,将检测到的边缘信息输出,确保裁剪的准确性,减少浪费,并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉,且误差小…...

【学习笔记】理解深度学习的基础:机器学习

1. 机器学习基础 1.1 机器学习的定义与重要性 定义:深度学习是机器学习的一种特定形式。为了深入理解深度学习,必须牢固掌握机器学习的基本原理。机器学习算法是一种能够从数据中学习的算法,通过经验E在任务T上提高性能度量P(Mi…...

提升租赁效率的租赁小程序全解析

内容概要 在如今快节奏的生活中,租赁小程序俨然成为了提升租赁效率的一把利器。无论是个人还是企业,都会因其便捷的功能而受益。简单来说,租赁小程序能让繁琐的租赁流程变得轻松、高效。在这里,我们将带您畅游租赁小程序的海洋&a…...

Windows自动化Python pyautogui RPA操作

依赖包 import time import pyautogui import pyperclip import os import psutil from pywinauto.application import Application睡眠: pyautogui.sleep(1)鼠标事件: pyautogui.moveTo(100, 100, duration0.25) pyautogui.click(100, 100, duration0.…...

蓝桥杯_B组_省赛_2022(用作博主自己学习)

题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…...

RK3568 Android 13 内置搜狗输入法小计

问:为什么写? 答:网上搜出来的都试过了,不行!下面直接上代码和注意事项! 首先到这个目录(/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall&#xff09…...

单片机Day1

目录 一.什么是单片机? 二.单片机的组成 三.封装形式 四.优势 五.分类 通用型: 专用型: 按处理的二进制位可以分为: 六.应用: 七.发展趋势 1.增加CPU的数据总线宽度。 2.存储器的发展。 3.片内1/0的改进 …...

《机器学习》之贝叶斯(Bayes)算法

目录 一、前言 二、贝叶斯算法原理解析 1、贝叶斯公式 2、朴素贝叶斯算法 3、计算步骤 4、例题: (1)、 计算先验概率 (2)、计算条件概率 (3)、计算后验概率 (4)…...

Redis实现高效的负载均衡算法

1. Redis存储设计 我们需要在 Redis 中存储以下信息&#xff1a; 配置列表&#xff08;List<Config>&#xff09;&#xff1a;存储所有配置项。总权重&#xff1a;存储所有配置的总权重。当前轮询状态&#xff1a;存储当前的轮询状态&#xff08;如当前随机值或索引&am…...

虚拟文件系统 VFS

目录 虚拟文件系统 VFS 文件系统挂载过程 虚拟文件系统 VFS 统一标准的系统调用接口&#xff1a; VFS定义了一组标准的文件操作API&#xff0c;如open(), read(), write(), close()等&#xff0c;使得用户空间的应用程序无需关心底层文件系统的具体类型。 下层文件系统必须实现…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...