在本章中,我们将深入探讨 Node.js 中的文件系统模块,也称为 fs 模块。该模块提供了多种方法来操作文件和目录。我们将从基础开始,介绍如何使用 fs 模块进行基本的文件读写操作,然后逐步深入到更复杂的功能,如异步操作、流处理等。
文件系统的基本操作
读取文件
在 Node.js 中,你可以使用 fs.readFile() 方法来读取文件的内容。此方法需要两个参数:一个是要读取的文件路径,另一个是一个回调函数,用于处理读取的结果。回调函数接收两个参数:一个是错误对象(如果发生错误),另一个是文件内容。
const fs = require('fs');
fs.readFile('./example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});写入文件
要向文件写入数据,可以使用 fs.writeFile() 方法。此方法同样接受两个主要参数:一个是要写入的文件路径,另一个是要写入的数据。此外,还可以指定编码选项。
const fs = require('fs');
fs.writeFile('./output.txt', 'Hello World!', (err) => {
if (err) throw err;
console.log('Data written to file');
});追加内容到文件
如果你想将一些文本追加到现有文件的末尾,而不是覆盖它,可以使用 fs.appendFile() 方法。
const fs = require('fs');
fs.appendFile('./output.txt', '\nThis is an appended text.', (err) => {
if (err) throw err;
console.log('Appended to file');
});删除文件
使用 fs.unlink() 方法可以删除一个文件。这个方法接受两个参数:一个是文件路径,另一个是一个回调函数,用于处理完成后的结果。
const fs = require('fs');
fs.unlink('./output.txt', (err) => {
if (err) throw err;
console.log('File deleted');
});异步与同步操作
异步操作
大多数 fs 模块的方法都是异步的,这意味着它们不会阻塞其他操作的执行。这对于提高应用性能非常关键。
同步操作
如果你需要确保文件操作完成后才继续执行其他代码,可以使用同步版本的方法。这些方法以 sync 结尾,例如 fs.readFileSync()。
const fs = require('fs');
try {
const data = fs.readFileSync('./example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}使用流处理文件
对于大文件,逐行读取或写入可能更加高效。Node.js 提供了流(Stream)的概念来处理这类问题。
创建可读流
// www.javascriptcn.com code example
const fs = require('fs');
const readStream = fs.createReadStream('./large-file.txt', { encoding: 'utf8' });
readStream.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data.`);
});
readStream.on('end', () => {
console.log('Read completed.');
});
readStream.on('error', (err) => {
console.error(err);
});创建可写流
// www.javascriptcn.com code example
const fs = require('fs');
const writeStream = fs.createWriteStream('./output-large.txt');
writeStream.write('This is a large file content.', 'utf8');
writeStream.end();
writeStream.on('finish', () => {
console.log('Writing finished.');
});
writeStream.on('error', (err) => {
console.error(err);
});管道流
管道允许你把一个流的数据作为输入直接传递给另一个流,这使得处理大文件变得更加简单和高效。
const fs = require('fs');
const readStream = fs.createReadStream('./source.txt');
const writeStream = fs.createWriteStream('./destination.txt');
readStream.pipe(writeStream);通过这些例子,你应该对 Node.js 中的文件系统操作有了更全面的理解。接下来,我们可以在实际项目中应用这些知识,创建更加高效和功能丰富的应用程序。