Node.js的fs
模块是文件系统操作的核心工具,提供了丰富的API用于处理文件和目录。本文将系统讲解常用操作,并提供可直接复用的代码示例。
一、文件操作
1.异步读取文件 readFile()
1 2 3 4 5 6 7 8
| const fs = require('fs');
fs.readFile('test.txt', 'utf8', (err, data) => { if (err) return console.error(err); console.log(data); });
|
2.同步读取文件(阻塞主线程) readFileSync()
1 2 3 4 5 6 7 8 9 10
| const fs = require('fs');
try { const data = fs.readFileSync('test.txt', 'utf8'); console.log(data); } catch (err) { console.error(err); }
|
3. 异步写入文件 writeFile()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const fs = require('fs');
fs.writeFile('output.txt', 'Hello Node.js!', (err) => { if (err) return console.error(err); console.log(' 写入成功'); });
fs.appendFile('output.txt', '\n追加内容', (err) => { if (err) return console.error(err); console.log(' 追加成功'); });
|
4. 同步写入文件 writeFileSync()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const fs = require('fs');
try { fs.writeFileSync('sync.txt', '同步覆盖写入内容'); console.log(' 同步覆盖写入成功'); } catch (err) { console.error(err); }
try { fs.appendFileSync('sync.txt', '同步追加写入内容'); console.log(' 同步追加写入成功'); } catch (err) { console.error(err); }
|
二、目录操作
1. 创建目录 mkdir()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const fs = require('fs');
fs.mkdir('uploads', { recursive: true }, (err) => { if (err) return console.error(err); console.log(' 目录创建成功'); });
try { fs.mkdirSync('uploads_sync', { recursive: true }); console.log(' 同步目录创建成功'); } catch (err) { console.error(err); }
|
2. 读取目录内容 readdirSync()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const fs = require('fs');
fs.readdir('uploads', (err, files) => { if (err) return console.error(err); console.log(' 目录内容:', files); });
try { const files = fs.readdirSync('uploads'); console.log(' 同步读取目录内容:', files); } catch (err) { console.error(err); }
|
3. 删除目录 rmdir()
1 2 3 4 5 6 7 8 9
| const fs = require('fs');
fs.rmdir('uploads', (err) => { if (err) return console.error(err); console.log(' 目录删除成功'); });
|
1 2 3 4 5
| fs.rmdir('uploads', {recursive:true} ,(err) => { if (err) return console.error(err); console.log(' 目录删除成功'); });
|
三、流处理(大文件操作)
1. 读取流
1 2 3 4 5 6 7
| const fs = require('fs');
const readStream = fs.createReadStream('largefile.mp4'); readStream.on('data', (chunk) => { console.log(` 读取到 ${chunk.length} 字节`); });
|
2. 写入流
1 2 3 4 5 6
| const fs = require('fs');
const writeStream = fs.createWriteStream('output.mp4'); writeStream.write(' 文件头数据'); writeStream.end(' 文件尾数据');
|
3. 管道流复制文件
1 2 3 4 5 6 7 8 9
| const fs = require('fs');
const rs = fs.createReadStream('source.txt'); const ws = fs.createWriteStream('destination.txt'); rs.pipe(ws).on('finish', () => { console.log(' 复制完成'); });
|
四、错误处理
1. 异步操作错误处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const fs = require('fs');
fs.readFile('nonexistent.txt', (err, data) => { if (err) { if (err.code === 'ENOENT') { console.log(' 文件不存在'); } else { console.error(' 读取错误:', err); } return; } console.log(data); });
|
2. 同步操作错误处理
1 2 3 4 5 6 7 8 9
| const fs = require('fs');
try { const stats = fs.statSync('test.txt'); console.log(stats.isFile()); } catch (err) { console.error(' 同步错误:', err); }
|
五、最佳实践
- 优先使用异步方法:避免阻塞事件循环(如
readFile
优于readFileSync
)。
- 流处理大文件:避免内存溢出,推荐使用
createReadStream
和pipe
。
- 权限控制:通过
mode
参数设置文件权限(如0o666
表示读写权限)。
- 路径处理:结合
path
模块处理跨平台路径问题。
总结
本文覆盖了fs
模块的核心操作,包括文件读写、目录管理、流处理及错误处理。通过示例代码可快速上手,建议在实际项目中结合path
模块和异步编程模式优化性能。更多细节可参考Node.js官方文档 。