node中的fs模块常用操作

Node.js的fs模块是文件系统操作的核心工具,提供了丰富的API用于处理文件和目录。本文将系统讲解常用操作,并提供可直接复用的代码示例。

一、文件操作

1.异步读取文件 readFile()

1
2
3
4
5
6
7
8
// 导入fs模块
const fs = require('fs');

// 从test.txt文件中读取数据至data中
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
// 导入fs模块
const fs = require('fs');

// 从test.txt文件中读取保存至data中
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
// 导入fs模块
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
// 导入fs模块
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
// 导入fs模块
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
// 导入fs模块
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
// 导入fs模块
const fs = require('fs');

// 异步删除空目录
fs.rmdir('uploads', (err) => {
if (err) return console.error(err);
console.log(' 目录删除成功');
});

1
2
3
4
5
// 递归删除非空目录 以对象的形式添加第二个参数:{recursive:true}
fs.rmdir('uploads', {recursive:true} ,(err) => {
if (err) return console.error(err);
console.log(' 目录删除成功');
});

三、流处理(大文件操作)

1. 读取流

1
2
3
4
5
6
7
// 导入fs模块
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
// 导入fs模块
const fs = require('fs');

const writeStream = fs.createWriteStream('output.mp4');
writeStream.write(' 文件头数据');
writeStream.end(' 文件尾数据');

3. 管道流复制文件

1
2
3
4
5
6
7
8
9
// 导入fs模块
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
// 导入fs模块
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
// 导入fs模块
const fs = require('fs');

try {
const stats = fs.statSync('test.txt');
console.log(stats.isFile());
} catch (err) {
console.error(' 同步错误:', err);
}

五、最佳实践

  1. 优先使用异步方法:避免阻塞事件循环(如readFile优于readFileSync)。
  2. 流处理大文件:避免内存溢出,推荐使用createReadStreampipe
  3. 权限控制:通过mode参数设置文件权限(如0o666表示读写权限)。
  4. 路径处理:结合path模块处理跨平台路径问题。

总结

本文覆盖了fs模块的核心操作,包括文件读写、目录管理、流处理及错误处理。通过示例代码可快速上手,建议在实际项目中结合path模块和异步编程模式优化性能。更多细节可参考Node.js官方文档