it编程 > 前端脚本 > Node.js

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

5人参与 2025-04-24 Node.js

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);
});

说明:

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);
});

说明:

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 秒后关闭

说明:

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 秒后停止

说明:

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. 总结

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

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

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Node.js接入DeepSeek实现流式对话功能

04-24

mac安装nvm(node.js)多版本管理实践步骤

04-24

Node.js net模块的使用示例

04-24

Node.js 中的流Stream模块简介及如何使用流进行数据处理

04-24

windows利用nvm管理node.js2025最新版

04-24

npm安装慢的问题分析及解决方法

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论