fs 模块详解

Node.js 是一款基于 JavaScript 的服务端开发框架,其中内置的 fs 文件系统模块为开发者提供了强大的文件处理能力。本文将详细介绍 Node.js 的 fs 模块,帮助你更好地理解文件操作的各种方式和方法,掌握如何使用该模块处理文件和目录。

fs 模块概述

模块介绍

fs(File System)模块是 Node.js 内置的核心模块之一,提供了文件读写、目录管理等一系列与文件系统相关的 API。通过 fs 模块,开发者可以在不引入外部依赖的情况下,进行文件操作、流操作等。

该模块包含的 API 主要分为同步和异步两类,异步 API 更加适合大规模 I/O 密集型操作,因为它不会阻塞主线程,而同步 API 更适合处理简单的文件操作或需要按顺序执行的操作。

fs 模块的加载

在使用 fs 模块之前,首先需要通过 require 关键字将其引入:

1
const fs = require('fs');

此操作后,你便可以使用 fs 提供的所有功能。

文件操作

读取文件

文件读取是 fs 模块的常见功能之一,开发者可以使用 fs.readFilefs.readFileSync 来读取文件。

  • 异步读取文件

异步读取文件的优势在于不会阻塞主线程,可以提升 I/O 性能:

1
2
3
4
5
6
7
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});

其中,example.txt 是要读取的文件名,utf8 表示文件的编码格式。回调函数的 err 参数用于捕获错误,data 则是读取到的文件内容。

  • 同步读取文件

同步方式会在读取文件时阻塞程序的执行,适合用在简单的脚本或不需要并发处理的场景:

1
2
3
4
5
6
try {
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}

写入文件

fs 提供了多种方式来写入文件,包括异步的 fs.writeFile 和同步的 fs.writeFileSync

  • 异步写入文件
1
2
3
4
5
6
7
fs.writeFile('example.txt', 'Hello World!', (err) => {
if (err) {
console.error(err);
return;
}
console.log('文件写入成功!');
});
  • 同步写入文件
1
2
3
4
5
6
try {
fs.writeFileSync('example.txt', 'Hello World!');
console.log('文件写入成功!');
} catch (err) {
console.error(err);
}

追加文件内容

如果需要在文件的现有内容后追加新内容,可以使用 fs.appendFilefs.appendFileSync

1
2
3
4
5
6
7
fs.appendFile('example.txt', ' 追加内容', (err) => {
if (err) {
console.error(err);
return;
}
console.log('内容追加成功!');
});

删除文件

文件删除也是常见的文件操作之一。fs.unlinkfs.unlinkSync 可用于删除文件:

  • 异步删除文件
1
2
3
4
5
6
7
fs.unlink('example.txt', (err) => {
if (err) {
console.error(err);
return;
}
console.log('文件删除成功!');
});
  • 同步删除文件
1
2
3
4
5
6
try {
fs.unlinkSync('example.txt');
console.log('文件删除成功!');
} catch (err) {
console.error(err);
}

目录操作

除了文件操作,fs 模块也提供了丰富的目录操作方法,包括创建、读取、删除目录等。

创建目录

  • 异步创建目录

使用 fs.mkdir 可以异步创建新目录:

1
2
3
4
5
6
7
fs.mkdir('newDir', { recursive: true }, (err) => {
if (err) {
console.error(err);
return;
}
console.log('目录创建成功!');
});

其中,recursive: true 选项确保如果父目录不存在,也会一并创建。

  • 同步创建目录
1
2
3
4
5
6
try {
fs.mkdirSync('newDir', { recursive: true });
console.log('目录创建成功!');
} catch (err) {
console.error(err);
}

读取目录内容

fs.readdirfs.readdirSync 用于读取目录中的文件和子目录:

1
2
3
4
5
6
7
fs.readdir('newDir', (err, files) => {
if (err) {
console.error(err);
return;
}
console.log('目录内容:', files);
});

删除目录

  • 异步删除目录

通过 fs.rmdir 可以删除空目录,但如果要删除非空目录,需配合其他方法或使用 fs.rm

1
2
3
4
5
6
7
fs.rmdir('newDir', (err) => {
if (err) {
console.error(err);
return;
}
console.log('目录删除成功!');
});
  • 同步删除目录
1
2
3
4
5
6
try {
fs.rmdirSync('newDir');
console.log('目录删除成功!');
} catch (err) {
console.error(err);
}

文件状态与权限操作

fs 模块还提供了检查文件状态、修改权限的 API,常用于文件系统的更深入操作。

检查文件状态

通过 fs.stat 可以检查文件或目录的状态信息,包括文件大小、创建时间等:

1
2
3
4
5
6
7
fs.stat('example.txt', (err, stats) => {
if (err) {
console.error(err);
return;
}
console.log('文件状态:', stats);
});

修改文件权限

fs.chmodfs.chown 可用于修改文件或目录的权限和所有者:

1
2
3
4
5
6
7
fs.chmod('example.txt', 0o755, (err) => {
if (err) {
console.error(err);
return;
}
console.log('权限修改成功!');
});

文件流操作

Node.js 的 fs 模块还支持流操作,适合处理大文件或者需要分批次处理数据的场景。

读取文件流

使用 fs.createReadStream 可以读取大文件,而不会一次性将文件内容全部加载到内存中:

1
2
3
4
const readStream = fs.createReadStream('example.txt', 'utf8');
readStream.on('data', (chunk) => {
console.log('读取到数据:', chunk);
});

写入文件流

通过 fs.createWriteStream 可以将数据流写入到文件中:

1
2
3
const writeStream = fs.createWriteStream('example.txt');
writeStream.write('这是通过流写入的内容');
writeStream.end();

总结

Node.js 的 fs 模块为开发者提供了全面且灵活的文件系统操作能力,涵盖了从文件读写、目录管理到权限操作和流操作等各个方面。通过合理使用 fs 模块,开发者能够高效地管理文件和目录,处理各种复杂的 I/O 操作。