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

打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

目次
1. 流式文件处理惩罚
示例:大文件复制
2. 文件监控
示例:使用 fs.watch 监控文件变化
3. 异步递归操作
示例:异步递归遍历目次
4. 文件权限管理
示例:修改文件权限
5. 原子操作
示例:原子重命名文件


在 Node.js 里,fs(文件体系)模块提供了一系列用于与文件体系进行交互的方法。除了常见的读写文件操作,还有一些高级用法,以下为你详细先容:
1. 流式文件处理惩罚

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

  1. const fs = require('fs');
  2. // 创建可读流
  3. const readStream = fs.createReadStream('largeFile.txt');
  4. // 创建可写流
  5. const writeStream = fs.createWriteStream('copiedLargeFile.txt');
  6. // 将可读流的数据管道传输到可写流
  7. readStream.pipe(writeStream);
  8. // 监听可读流的结束事件
  9. readStream.on('end', () => {
  10.     console.log('文件复制完成');
  11. });
  12. // 监听错误事件
  13. readStream.on('error', (err) => {
  14.     console.error('读取文件时出错:', err);
  15. });
  16. writeStream.on('error', (err) => {
  17.     console.error('写入文件时出错:', err);
  18. });
复制代码
在上述代码中,createReadStream 方法创建了一个可读流,createWriteStream 方法创建了一个可写流。通过 pipe 方法将可读流的数据传输到可写流,实现了大文件的复制。
2. 文件监控

fs.watch 和 fs.watchFile 方法可用于监控文件或目次的变化。
示例:使用 fs.watch 监控文件变化

  1. const fs = require('fs');
  2. // 监控文件
  3. fs.watch('test.txt', (eventType, filename) => {
  4.     if (filename) {
  5.         console.log(`${filename} 文件发生了 ${eventType} 事件`);
  6.     }
  7. });
复制代码
fs.watch 方法会在文件或目次发生变化时触发回调函数,eventType 表现变乱类型(如 change 或 rename),filename 表现发生变化的文件或目次名。
3. 异步递归操作

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

  1. const fs = require('fs');
  2. const path = require('path');
  3. async function traverseDirectory(dir) {
  4.     try {
  5.         const files = await fs.promises.readdir(dir);
  6.         for (const file of files) {
  7.             const filePath = path.join(dir, file);
  8.             const stat = await fs.promises.stat(filePath);
  9.             if (stat.isDirectory()) {
  10.                 // 如果是目录,递归调用
  11.                 await traverseDirectory(filePath);
  12.             } else {
  13.                 console.log(filePath);
  14.             }
  15.         }
  16.     } catch (err) {
  17.         console.error('遍历目录时出错:', err);
  18.     }
  19. }
  20. // 调用函数开始遍历
  21. traverseDirectory('yourDirectoryPath');
复制代码
在上述代码中,traverseDirectory 函数会递归地遍历指定目次及其子目次,并打印出全部文件的路径。
4. 文件权限管理

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

  1. const fs = require('fs');
  2. // 修改文件权限为 755
  3. fs.chmod('test.txt', 0o755, (err) => {
  4.     if (err) {
  5.         console.error('修改文件权限时出错:', err);
  6.     } else {
  7.         console.log('文件权限修改成功');
  8.     }
  9. });
复制代码
fs.chmod 方法用于修改文件的权限,第一个参数是文件路径,第二个参数是权限模式(使用八进制表现),第三个参数是回调函数。
5. 原子操作

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

  1. const fs = require('fs');
  2. fs.rename('oldName.txt', 'newName.txt', (err) => {
  3.     if (err) {
  4.         console.error('重命名文件时出错:', err);
  5.     } else {
  6.         console.log('文件重命名成功');
  7.     }
  8. });
复制代码
fs.rename 方法可以原子地重命名文件,确保操作的原子性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表