Node.js的fs模块:文件系统操作详解

fs
模块是 Node.js 核心模块之一,全称为 File System
,用于与文件系统进行交互。它提供了同步和异步两种方式来操作文件,涵盖了文件的读取、写入、删除、重命名、目录操作等功能。以下是对 fs
模块的理解以及常用方法的详细介绍:
1. 理解 fs
模块
- 异步 vs 同步:
- 异步方法:通过回调函数或
Promise
处理结果,适合 I/O 密集型操作,避免阻塞主线程。 - 同步方法:直接返回结果,适合脚本或初始化阶段,但会阻塞主线程。
- 异步方法:通过回调函数或
- 文件描述符:
fs
模块操作文件时,可以通过文件路径或文件描述符(fd
)来标识文件。 - 流式操作:
fs
模块支持流式读写(如fs.createReadStream
和fs.createWriteStream
),适合处理大文件。 - 跨平台兼容性:
fs
模块在不同操作系统上表现一致,但需要注意路径分隔符(/
或\
)的差异。
2. 常用方法
以下是 fs
模块的常用方法及其用途:
文件读写
- 异步读取文件:
const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); });
- 同步读取文件:
const data = fs.readFileSync('file.txt', 'utf8'); console.log(data);
- 异步写入文件:
fs.writeFile('file.txt', 'Hello, World!', 'utf8', (err) => { if (err) throw err; console.log('File written successfully'); });
- 同步写入文件:
fs.writeFileSync('file.txt', 'Hello, World!', 'utf8');
文件追加
- 异步追加内容:
fs.appendFile('file.txt', 'New content', 'utf8', (err) => { if (err) throw err; console.log('Content appended'); });
- 同步追加内容:
fs.appendFileSync('file.txt', 'New content', 'utf8');
文件删除
- 异步删除文件:
fs.unlink('file.txt', (err) => { if (err) throw err; console.log('File deleted'); });
- 同步删除文件:
fs.unlinkSync('file.txt');
文件重命名
- 异步重命名:
fs.rename('old.txt', 'new.txt', (err) => { if (err) throw err; console.log('File renamed'); });
- 同步重命名:
fs.renameSync('old.txt', 'new.txt');
目录操作
- 创建目录:
fs.mkdir('newDir', { recursive: true }, (err) => { if (err) throw err; console.log('Directory created'); });
- 删除目录:
fs.rmdir('dir', { recursive: true }, (err) => { if (err) throw err; console.log('Directory deleted'); });
- 读取目录内容:
fs.readdir('dir', (err, files) => { if (err) throw err; console.log(files); });
文件信息
- 获取文件状态:
fs.stat('file.txt', (err, stats) => { if (err) throw err; console.log(stats.isFile()); // 是否是文件 console.log(stats.isDirectory()); // 是否是目录 console.log(stats.size); // 文件大小 });
流式操作
- 创建可读流:
const readStream = fs.createReadStream('file.txt', 'utf8'); readStream.on('data', (chunk) => { console.log(chunk); });
- 创建可写流:
const writeStream = fs.createWriteStream('output.txt'); writeStream.write('Hello, World!'); writeStream.end();
文件描述符
- 打开文件:
fs.open('file.txt', 'r', (err, fd) => { if (err) throw err; console.log('File opened with fd:', fd); });
- 关闭文件:
fs.close(fd, (err) => { if (err) throw err; console.log('File closed'); });
3. 最佳实践
- 优先使用异步方法:避免阻塞主线程,提升性能。
- 处理错误:始终检查回调函数中的
err
参数,避免程序崩溃。 - 使用
Promise
或async/await
:现代 Node.js 支持fs.promises
API,可以更方便地处理异步操作:const fs = require('fs').promises; async function readFile() { try { const data = await fs.readFile('file.txt', 'utf8'); console.log(data); } catch (err) { console.error(err); } }
- 流式处理大文件:避免一次性读取大文件导致内存溢出。
- 路径处理:使用
path
模块处理路径,确保跨平台兼容性。
4. 总结
fs
模块是 Node.js 中操作文件系统的核心工具,提供了丰富的 API 来满足各种文件操作需求。在实际开发中,应根据场景选择合适的同步或异步方法,并结合流式操作和错误处理,确保代码的健壮性和性能。