Node.js 中 fs 模块的高级用法实例详解

 更新时间:2025年02月25日 11:38:23   作者:小灰灰学编程  
文章介绍了Node.js中fs模块的高级用法,包括流式读写、文件监视、PromiseAPI、递归目录操作等,这些功能有助于更好地处理复杂文件操作场景,提升代码性能和可维护性,感兴趣的朋友跟随小编一起看看吧

fs 模块不仅提供了基本的文件读写操作,还支持一些高级功能,如流式读写、文件监视、Promise API 等。这些高级用法可以更好地满足复杂场景的需求,如大文件处理、实时监控等。

1. 流式读写

流(Stream)是 Node.js 中处理大文件或连续数据的核心概念。fs 模块提供了 fs.createReadStreamfs.createWriteStream 方法,用于以流的方式读写文件。

1.1 流式读取文件

const fs = require('fs');
// 创建可读流
const readStream = fs.createReadStream('largeFile.txt', 'utf8');
// 监听数据事件
readStream.on('data', (chunk) => {
  console.log('Received chunk:', chunk.length);
});
// 监听结束事件
readStream.on('end', () => {
  console.log('File reading completed');
});
// 监听错误事件
readStream.on('error', (err) => {
  console.error('Error reading file:', err);
});

说明:

  • fs.createReadStream 创建一个可读流,逐块读取文件内容。
  • data 事件:每次读取到数据块时触发。
  • end 事件:文件读取完成时触发。
  • error 事件:读取过程中发生错误时触发。

1.2 流式写入文件

const fs = require('fs');
// 创建可写流
const writeStream = fs.createWriteStream('output.txt');
// 写入数据
writeStream.write('Hello, world!\n');
writeStream.write('This is a stream example.\n');
// 结束写入
writeStream.end();
// 监听完成事件
writeStream.on('finish', () => {
  console.log('File writing completed');
});
// 监听错误事件
writeStream.on('error', (err) => {
  console.error('Error writing file:', err);
});

说明:

  • fs.createWriteStream 创建一个可写流,逐块写入文件内容。
  • write 方法:写入数据。
  • end 方法:结束写入。
  • finish 事件:写入完成时触发。
  • error 事件:写入过程中发生错误时触发。

1.3 管道操作

管道(Pipe)是将可读流和可写流连接起来的便捷方式,常用于文件复制。

const fs = require('fs');
// 创建可读流和可写流
const readStream = fs.createReadStream('source.txt');
const writeStream = fs.createWriteStream('destination.txt');
// 使用管道复制文件
readStream.pipe(writeStream);
// 监听完成事件
writeStream.on('finish', () => {
  console.log('File copied successfully');
});
// 监听错误事件
readStream.on('error', (err) => {
  console.error('Error reading file:', err);
});
writeStream.on('error', (err) => {
  console.error('Error writing file:', err);
});

2. 文件监视

fs 模块提供了 fs.watchfs.watchFile 方法,用于监视文件或目录的变化。

2.1 使用 fs.watch

const fs = require('fs');
// 监视文件变化
const watcher = fs.watch('example.txt', (eventType, filename) => {
  console.log(`Event type: ${eventType}`);
  if (filename) {
    console.log(`File changed: ${filename}`);
  }
});
// 关闭监视器
setTimeout(() => {
  watcher.close();
  console.log('Watcher closed');
}, 10000); // 10 秒后关闭

说明:

  • fs.watch 监视文件或目录的变化。
  • eventType:事件类型(如 changerename)。
  • filename:发生变化的文件名。

2.2 使用 fs.watchFile

const fs = require('fs');
// 监视文件变化
fs.watchFile('example.txt', { interval: 1000 }, (curr, prev) => {
  if (curr.mtime !== prev.mtime) {
    console.log('File modified');
  }
});
// 停止监视
setTimeout(() => {
  fs.unwatchFile('example.txt');
  console.log('Stopped watching file');
}, 10000); // 10 秒后停止

说明:

  • fs.watchFile 定期检查文件状态。
  • currprev:当前和之前的文件状态对象。
  • interval:检查间隔(毫秒)。

3. Promise API

Node.js 从 v10 开始提供了 fs.promises API,支持基于 Promise 的文件操作。

3.1 使用 fs.promises 读取文件

const fs = require('fs').promises;
async function readFile() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log('File content:', data);
  } catch (err) {
    console.error('Failed to read file:', err);
  }
}
readFile();

3.2 使用 fs.promises 写入文件

const fs = require('fs').promises;
async function writeFile() {
  try {
    await fs.writeFile('example.txt', 'Hello, world!', 'utf8');
    console.log('File written successfully');
  } catch (err) {
    console.error('Failed to write file:', err);
  }
}
writeFile();

4. 递归目录操作

4.1 递归读取目录

const fs = require('fs');
const path = require('path');
async function readDirRecursive(dir) {
  const files = await fs.promises.readdir(dir);
  for (const file of files) {
    const filePath = path.join(dir, file);
    const stats = await fs.promises.stat(filePath);
    if (stats.isDirectory()) {
      await readDirRecursive(filePath); // 递归读取子目录
    } else {
      console.log('File:', filePath);
    }
  }
}
readDirRecursive('./').catch((err) => {
  console.error('Failed to read directory:', err);
});

4.2 递归删除目录

const fs = require('fs');
const path = require('path');
async function deleteDirRecursive(dir) {
  const files = await fs.promises.readdir(dir);
  for (const file of files) {
    const filePath = path.join(dir, file);
    const stats = await fs.promises.stat(filePath);
    if (stats.isDirectory()) {
      await deleteDirRecursive(filePath); // 递归删除子目录
    } else {
      await fs.promises.unlink(filePath); // 删除文件
      console.log('Deleted file:', filePath);
    }
  }
  await fs.promises.rmdir(dir); // 删除空目录
  console.log('Deleted directory:', dir);
}
deleteDirRecursive('./temp').catch((err) => {
  console.error('Failed to delete directory:', err);
});

5. 总结

  • 流式读写:适合处理大文件,避免内存占用过高。
  • 文件监视:实时监控文件或目录的变化。
  • Promise API:简化异步操作,避免回调地狱。
  • 递归操作:处理嵌套目录结构。

通过掌握 fs 模块的高级用法,可以更好地应对复杂的文件操作场景,提升代码的性能和可维护性。

到此这篇关于Node.js 中 fs 模块的高级用法的文章就介绍到这了,更多相关Node.js fs 模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • sublime text配置node.js调试(图文教程)

    sublime text配置node.js调试(图文教程)

    下面小编就为大家分享一篇sublime text配置node.js调试(图文教程),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • nodejs入门教程六:express模块用法示例

    nodejs入门教程六:express模块用法示例

    这篇文章主要介绍了nodejs入门教程之express模块用法,结合实例形式分析了express模块的功能、创建、路由相关使用技巧,需要的朋友可以参考下
    2017-04-04
  • npm install安装过程报错的实用解决办法

    npm install安装过程报错的实用解决办法

    最近做项目遇到npm install 的问题,下面这篇文章主要给大家介绍了关于npm install安装过程报错的实用解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • nodejs报digital envelope routines::unsupported错误的最新解决方法

    nodejs报digital envelope routines::unsupported错误的最新解决方法

    这篇文章主要介绍了nodejs报digital envelope routines::unsupported错误的最新解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 关于node-bindings无法在Electron中使用的解决办法

    关于node-bindings无法在Electron中使用的解决办法

    今天小编就为大家分享一篇关于关于node-bindings无法在Electron中使用的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Mac下安装node.js及环境配置全过程

    Mac下安装node.js及环境配置全过程

    这篇文章主要介绍了Mac下安装node.js及环境配置全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Windows8下搭建Node.js开发环境教程

    Windows8下搭建Node.js开发环境教程

    这篇文章主要介绍了Windows8下搭建Node.js开发环境教程,Win8下安装node.js也比较简单,只是一些权限比较麻烦,需要的朋友可以参考下
    2014-09-09
  • node强缓存和协商缓存实战示例

    node强缓存和协商缓存实战示例

    这篇文章主要为大家介绍了node强缓存和协商缓存实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • node.js操作mongodb简单示例分享

    node.js操作mongodb简单示例分享

    MongoDB是基于Javascript语言的数据库,存储格式是JSON,而Node也是基于JavaScript的环境(库),所以node和mongoDB的搭配能减少因为数据转换带来的时间空间开销。今天我们来看看如何通过node.js来操作MongoliaDB
    2017-05-05
  • array-uniq的安装和使用方法

    array-uniq的安装和使用方法

    array-uniq是一个非常实用的NPM包,用于在JavaScript中创建不含重复元素的数组,它提供了一个简单而有效的方法来去除数组中的重复项,本文将介绍如何安装和使用array-uniq来清理你的数组数据,需要的朋友可以参考下
    2024-06-06

最新评论