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.rm

fs.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("删除成功");
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】Unity 使用 Sqlite 数据库

1.找到需要三个 DLL Mono.Data.Sqlite.dllSystem.Data.dllsqlite3.dll 上面两个dll可在本地unity安装目录找到: C:\Program Files\Unity\Hub\Editor\2022.3.xxf1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32 下面dll可在sqlite官网下载到&#xff…

省级-农业科技创新(农业科技专利)数据(2010-2022年)-社科数据

省级-农业科技创新(农业科技专利)数据(2010-2022年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028570 https://download.csdn.net/download/paofuluolijiang/90028570 数据 年份、省份、农业科技专利数量…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器:定时器0、定时器1、定时器2 注意:51系列单片机一定有基本的2个定时器(定时器0和定时器1),但不全有3个中断,需要查看芯片手册,通常我们使用的是基本的2个定时器&#xff…

计算机的错误计算(二百零九)

摘要 利用两个大模型判断 是否为有理数?其值是多少?由实验知,其中一个大模型判断错误,说不是有理数;至于其值,该大模型选了一个错误的数值。 例1. e^(45*ln(24.8))是有理数吗?其值是多少&am…

Facebook 隐私变革之路:回顾与展望

在数字时代,个人隐私的保护一直是社交平台面临的重大挑战之一。作为全球最大的社交网络平台,Facebook(现为Meta)在处理用户隐私方面的变革,历经了多次调整与完善。本文将回顾Facebook在隐私保护方面的历程,…

第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目

Q1、跳过交替单元格的之字形遍历 1、题目描述 给你一个 m x n 的二维数组 grid,数组由 正整数 组成。 你的任务是以 之字形 遍历 grid,同时跳过每个 交替 的单元格。 之字形遍历的定义如下: 从左上角的单元格 (0, 0) 开始。在当前行中向…

GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目

1、查看gitlab版本 建议安装的runner版本和gitlab保持一致 2、查找runner 执行 yum list gitlab-runner --showduplicates | sort -r 找到符合gitlab版本的runner,我这里选择 14.9.1版本 如果执行出现找不到下载源,添加官方仓库 执行 curl -L &quo…

机器学习基础-机器学习的常用学习方法

目录 半监督学习的概念 规则学习的概念 基本概念 机器学习里的规则 逻辑规则 规则集 充分性与必要性 冲突消解 命题逻辑 → 命题规则 序贯覆盖 单条规则学习 剪枝优化 强化学习的概念 1. 强化学习对应了四元组 2. 强化学习的目标 强化学习常用马尔可夫决策过程…

docker安装rabbit后访问报错最佳的几种解决方案

错误通常是由于RabbitMQ的安全配置导致的,RabbitMQ默认配置允许的用户仅能通过localhost访问。这通常出现在RabbitMQ的guest用户上,guest用户默认只能从localhost登录,而无法从其他IP地址进行远程访问。 解决方法: 1. **创建一个…

26个开源Agent开发框架调研总结(2)

根据Markets & Markets的预测,到2030年,AI Agent的市场规模将从2024年的50亿美元激增至470亿美元,年均复合增长率为44.8%。 Gartner预计到2028年,至少15%的日常工作决策将由AI Agent自主完成,AI Agent在企业应用中…

第 32 章 - Elasticsearch 的应用场景与技术解决方案

思维导图 0. 简介 Elasticsearch 主要应用于搜索场景。场景的如 应用内的搜索框、还有日志搜索等。 下面将介绍 Elasticsearch 在开发中的常见应用场景。 1. 日志搜索 日志搜索是最常见的应用。 其组合技术为:Kafka、Logstash、Elasticsearch、Kibana 该组合整体…

VsCode对Arduino的开发配置

ps:我的情况是在对esp32进行编译、烧录时,找不到按钮,无法识别Arduino文件,适合已经有ini文件的情况。 1.在vscode中安装拓展 2.打开设置,点击右上角,转到settings.json文件 3.复制以下代码并保存 {"…

python学opencv|读取图像(三十二)使用cv2.getPerspectiveTransform()函数制作透视图-变形的喵喵

【1】引言 前序已经对图像展开了平移、旋转缩放和倾斜拉伸技巧探索,相关链接为: python学opencv|读取图像(二十八)使用cv2.warpAffine()函数平移图像-CSDN博客 python学opencv|读取图像(二十…

AWS云计算概览(自用留存,整理中)

目录 一、云概念概览 (1)云计算简介 (2)云计算6大优势 (3)web服务 (4)AWS云采用框架(AWS CAF) 二、云经济学 & 账单 (1)定…

Unity TextMesh Pro入门

概述 TextMesh Pro是Unity提供的一组工具,用于创建2D和3D文本。与Unity的UI文本和Text Mesh系统相比,TextMesh Pro提供了更好的文本格式控制和布局管理功能。 本文介绍了TMP_Text组件和Tmp字体资产(如何创建字体资产和如何解决缺字问题),还有一些高级功…

数据结构与算法之链表: LeetCode 19. 删除链表的倒数第 N 个结点 (Ts版)

删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示…

【STM32-学习笔记-2-】外部中断

文章目录 外部中断Ⅰ、EXIT函数Ⅱ、EXTI_InitTypeDef结构体参数①、EXTI_Line②、EXTI_LineCmd③、EXTI_Mode④、EXTI_Trigger Ⅲ、NVIC函数Ⅳ、NVIC_InitTypeDef结构体参数①、NVIC_IRQChannel②、NVIC_IRQChannelCmd③、NVIC_IRQChannelPreemptionPriority④、NVIC_IRQChanne…

利用 awk 定制化处理大量数据的计算

问题 有上万行(甚至更多)不断递增的浮点数(每行一个),怎么将它们每四个一组计算每组第四个和第一个之间的差值,并打印输出计算结果? 例如文件 data 有以下数据: 2.699350 2.69935…

llama.cpp 模型可视化工具 GGUF Visualizer

llama.cpp 模型可视化工具 GGUF Visualizer 1. GGUF Visualizer for VS Code (gguf-viz)1.1. Features1.2. Extension Settings References GGUF Visualizer https://marketplace.visualstudio.com/items?itemNameAgainstEntropy.gguf-viz 1. GGUF Visualizer for VS Code (g…

10,STL——list类

一,list类的介绍和使用 1,了解list类 1. )list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. )list的底层是双向链表结构,双向链表中每个元素存储在互不相关…