Node.js 中 fs 模块的高级用法

server/2025/2/26 23:31:02/

目录

1. 流式文件处理

示例:大文件复制

2. 文件监控

示例:使用 fs.watch 监控文件变化

3. 异步递归操作

示例:异步递归遍历目录

4. 文件权限管理

示例:修改文件权限

5. 原子操作

示例:原子重命名文件


在 Node.js 里,fs(文件系统)模块提供了一系列用于与文件系统进行交互的方法。除了常见的读写文件操作,还有一些高级用法,以下为你详细介绍:

1. 流式文件处理

在处理大文件时,一次性将整个文件加载到内存中可能会导致内存溢出。使用流(Stream)可以逐块处理文件,减少内存使用。

示例:大文件复制
javascript">const fs = require('fs');// 创建可读流
const readStream = fs.createReadStream('largeFile.txt');
// 创建可写流
const writeStream = fs.createWriteStream('copiedLargeFile.txt');// 将可读流的数据管道传输到可写流
readStream.pipe(writeStream);// 监听可读流的结束事件
readStream.on('end', () => {console.log('文件复制完成');
});// 监听错误事件
readStream.on('error', (err) => {console.error('读取文件时出错:', err);
});writeStream.on('error', (err) => {console.error('写入文件时出错:', err);
});

在上述代码中,createReadStream 方法创建了一个可读流,createWriteStream 方法创建了一个可写流。通过 pipe 方法将可读流的数据传输到可写流,实现了大文件的复制。

2. 文件监控

fs.watch 和 fs.watchFile 方法可用于监控文件或目录的变化。

示例:使用 fs.watch 监控文件变化
javascript">const fs = require('fs');// 监控文件
fs.watch('test.txt', (eventType, filename) => {if (filename) {console.log(`${filename} 文件发生了 ${eventType} 事件`);}
});

fs.watch 方法会在文件或目录发生变化时触发回调函数,eventType 表示事件类型(如 change 或 rename),filename 表示发生变化的文件或目录名。

3. 异步递归操作

在处理目录树时,可能需要递归地遍历目录和子目录。可以使用异步函数和递归实现这一功能。

示例:异步递归遍历目录
javascript">const fs = require('fs');
const path = require('path');async function traverseDirectory(dir) {try {const files = await fs.promises.readdir(dir);for (const file of files) {const filePath = path.join(dir, file);const stat = await fs.promises.stat(filePath);if (stat.isDirectory()) {// 如果是目录,递归调用await traverseDirectory(filePath);} else {console.log(filePath);}}} catch (err) {console.error('遍历目录时出错:', err);}
}// 调用函数开始遍历
traverseDirectory('yourDirectoryPath');

在上述代码中,traverseDirectory 函数会递归地遍历指定目录及其子目录,并打印出所有文件的路径。

4. 文件权限管理

fs 模块可以用于修改文件的权限。

示例:修改文件权限
javascript">const fs = require('fs');// 修改文件权限为 755
fs.chmod('test.txt', 0o755, (err) => {if (err) {console.error('修改文件权限时出错:', err);} else {console.log('文件权限修改成功');}
});

fs.chmod 方法用于修改文件的权限,第一个参数是文件路径,第二个参数是权限模式(使用八进制表示),第三个参数是回调函数。

5. 原子操作

在多进程或多线程环境中,可能需要进行原子操作以避免数据竞争。fs 模块提供了一些原子操作方法,如 fs.rename

示例:原子重命名文件
javascript">const fs = require('fs');fs.rename('oldName.txt', 'newName.txt', (err) => {if (err) {console.error('重命名文件时出错:', err);} else {console.log('文件重命名成功');}
});

fs.rename 方法可以原子地重命名文件,确保操作的原子性。


http://www.ppmy.cn/server/170877.html

相关文章

Maven 基础环境搭建与配置(一)

一、Maven 初印象 在 Java 开发的广袤天地里,Maven 就像是一位神通广大的 “大管家”,为开发者们排忧解难,让项目管理与构建变得轻松高效。它是一个强大的项目管理和构建自动化工具,基于项目对象模型(POM)…

朴素贝叶斯法

文章目录 贝叶斯定理朴素贝叶斯法的学习与分类条件独立假设朴素贝叶斯的后验概率最大化准则朴素贝叶斯的基本公式 朴素贝叶斯法的参数估计极大似然估计 贝叶斯定理 前置知识:条件概率、全概率、贝叶斯公式 推荐视频,看完视频后搜索博客了解先验概率、后…

Node.js net 模块教程

Node.js net 模块教程 简介 Node.js 的 net 模块提供了用于实现 TCP 服务器和客户端的异步网络 API。它是 Node.js 网络功能的核心,为上层模块如 HTTP、HTTPS 等提供了基础支持。本教程将全面介绍 net 模块的使用方法和最佳实践。 引入 net 模块 const net req…

Day28 第八章 贪心算法 part01

一. 学习文章及资料 理论基础 455.分发饼干 376.摆动序列 53.最大子序和 二. 学习内容 1. 理论基础 贪心算法无规律! 一般如想到局部最优,好像能推出全局最优,并且无明显反例,那就试一试! 2. 分发饼干 (1) 解题思…

从零开始开发纯血鸿蒙应用之网页浏览

从零开始开发纯血鸿蒙应用 〇、前言一、优化菜单交互1、BuilderFunction.ets2、改造 PageTitleBar 二、网址打开1、方式选择1、使用浏览器打开2、内部打开2.1、声明权限2.2、封装 WebViewPage2.2.1、组件字段2.2.2、aboutToAppear2.2.3、onBackPress2.2.4、标题栏2.2.4、网页内…

c/c++蓝桥杯经典编程题100道(22)最短路径问题

最短路径问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 最短路径问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1:Dijkstra算法(正权图,难度★★) 解法2:Bellman-Ford算法(含负权边&a…

【数据挖掘】数据仓库

数据仓库 目录:数据仓库相关知识点笔记4.2 数据仓库建模:数据立方体与 OLAP4.2.1 数据立方体:一种多维数据模型4.2.2 星形、雪花形和事实星座:多维数据模型的模式4.2.3 维:概念分层的作用4.2.4 度量的分类和计算4.2.5 …

深度学习之特征提取

前言 深度学习就是把输入转换成一个高维的向量,之后利用这个向量去完成分类、回归等任务。 深度学习特征工程知识图谱 1. 特征提取的本质 核心目标:将原始数据→高维语义特征向量 监督驱动:标签决定特征提取方向 典型架构: …