ToB企服应用市场:ToB评测及商务社交产业平台

标题: Node.js 中 fs 模块的高级用法 [打印本页]

作者: 千千梦丶琪    时间: 7 天前
标题: Node.js 中 fs 模块的高级用法
fs 模块不但提供了根本的文件读写操作,还支持一些高级功能,如流式读写、文件监督、Promise API 等。这些高级用法可以更好地满足复杂场景的需求,如大文件处理、实时监控等。

1. 流式读写

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

  1. const fs = require('fs');
  2. // 创建可读流
  3. const readStream = fs.createReadStream('largeFile.txt', 'utf8');
  4. // 监听数据事件
  5. readStream.on('data', (chunk) => {
  6.   console.log('Received chunk:', chunk.length);
  7. });
  8. // 监听结束事件
  9. readStream.on('end', () => {
  10.   console.log('File reading completed');
  11. });
  12. // 监听错误事件
  13. readStream.on('error', (err) => {
  14.   console.error('Error reading file:', err);
  15. });
复制代码
阐明:


1.2 流式写入文件

  1. const fs = require('fs');
  2. // 创建可写流
  3. const writeStream = fs.createWriteStream('output.txt');
  4. // 写入数据
  5. writeStream.write('Hello, world!\n');
  6. writeStream.write('This is a stream example.\n');
  7. // 结束写入
  8. writeStream.end();
  9. // 监听完成事件
  10. writeStream.on('finish', () => {
  11.   console.log('File writing completed');
  12. });
  13. // 监听错误事件
  14. writeStream.on('error', (err) => {
  15.   console.error('Error writing file:', err);
  16. });
复制代码
阐明:


1.3 管道操作

管道(Pipe)是将可读流和可写流连接起来的便捷方式,常用于文件复制。
  1. const fs = require('fs');
  2. // 创建可读流和可写流
  3. const readStream = fs.createReadStream('source.txt');
  4. const writeStream = fs.createWriteStream('destination.txt');
  5. // 使用管道复制文件
  6. readStream.pipe(writeStream);
  7. // 监听完成事件
  8. writeStream.on('finish', () => {
  9.   console.log('File copied successfully');
  10. });
  11. // 监听错误事件
  12. readStream.on('error', (err) => {
  13.   console.error('Error reading file:', err);
  14. });
  15. writeStream.on('error', (err) => {
  16.   console.error('Error writing file:', err);
  17. });
复制代码

2. 文件监督

fs 模块提供了 fs.watch 和 fs.watchFile 方法,用于监督文件或目次的变化。
2.1 利用 fs.watch

  1. const fs = require('fs');
  2. // 监视文件变化
  3. const watcher = fs.watch('example.txt', (eventType, filename) => {
  4.   console.log(`Event type: ${eventType}`);
  5.   if (filename) {
  6.     console.log(`File changed: ${filename}`);
  7.   }
  8. });
  9. // 关闭监视器
  10. setTimeout(() => {
  11.   watcher.close();
  12.   console.log('Watcher closed');
  13. }, 10000); // 10 秒后关闭
复制代码
阐明:


2.2 利用 fs.watchFile

  1. const fs = require('fs');
  2. // 监视文件变化
  3. fs.watchFile('example.txt', { interval: 1000 }, (curr, prev) => {
  4.   if (curr.mtime !== prev.mtime) {
  5.     console.log('File modified');
  6.   }
  7. });
  8. // 停止监视
  9. setTimeout(() => {
  10.   fs.unwatchFile('example.txt');
  11.   console.log('Stopped watching file');
  12. }, 10000); // 10 秒后停止
复制代码
阐明:



3. Promise API

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

  1. const fs = require('fs').promises;
  2. async function readFile() {
  3.   try {
  4.     const data = await fs.readFile('example.txt', 'utf8');
  5.     console.log('File content:', data);
  6.   } catch (err) {
  7.     console.error('Failed to read file:', err);
  8.   }
  9. }
  10. readFile();
复制代码
3.2 利用 fs.promises 写入文件

  1. const fs = require('fs').promises;
  2. async function writeFile() {
  3.   try {
  4.     await fs.writeFile('example.txt', 'Hello, world!', 'utf8');
  5.     console.log('File written successfully');
  6.   } catch (err) {
  7.     console.error('Failed to write file:', err);
  8.   }
  9. }
  10. writeFile();
复制代码

4. 递归目次操作

4.1 递归读取目次

  1. const fs = require('fs');
  2. const path = require('path');
  3. async function readDirRecursive(dir) {
  4.   const files = await fs.promises.readdir(dir);
  5.   for (const file of files) {
  6.     const filePath = path.join(dir, file);
  7.     const stats = await fs.promises.stat(filePath);
  8.     if (stats.isDirectory()) {
  9.       await readDirRecursive(filePath); // 递归读取子目录
  10.     } else {
  11.       console.log('File:', filePath);
  12.     }
  13.   }
  14. }
  15. readDirRecursive('./').catch((err) => {
  16.   console.error('Failed to read directory:', err);
  17. });
复制代码
4.2 递归删除目次

  1. const fs = require('fs');
  2. const path = require('path');
  3. async function deleteDirRecursive(dir) {
  4.   const files = await fs.promises.readdir(dir);
  5.   for (const file of files) {
  6.     const filePath = path.join(dir, file);
  7.     const stats = await fs.promises.stat(filePath);
  8.     if (stats.isDirectory()) {
  9.       await deleteDirRecursive(filePath); // 递归删除子目录
  10.     } else {
  11.       await fs.promises.unlink(filePath); // 删除文件
  12.       console.log('Deleted file:', filePath);
  13.     }
  14.   }
  15.   await fs.promises.rmdir(dir); // 删除空目录
  16.   console.log('Deleted directory:', dir);
  17. }
  18. deleteDirRecursive('./temp').catch((err) => {
  19.   console.error('Failed to delete directory:', err);
  20. });
复制代码

5. 总结


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

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4