在本章中,我们将深入了解如何使用 Node.js 处理文件的读取和写入操作。这包括了同步和异步方法,以及一些实用的库来简化这些操作。
文件系统模块 (fs)
Node.js 提供了一个内置的文件系统模块 fs,用于处理文件系统的操作。这个模块提供了多种方法来读取、写入和管理文件。
fs.readFile() 和 fs.readFileSync()
fs.readFile() 和 fs.readFileSync() 方法分别用于异步和同步读取文件内容。
异步读取
// www.javascriptcn.com code example
const fs = require('fs');
fs.readFile('/path/to/file', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});同步读取
const fs = require('fs');
try {
const data = fs.readFileSync('/path/to/file', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}fs.writeFile() 和 fs.writeFileSync()
fs.writeFile() 和 fs.writeFileSync() 方法用于异步和同步地写入文件内容。
异步写入
// www.javascriptcn.com code example
const fs = require('fs');
fs.writeFile('/path/to/file', 'Hello World!', (err) => {
if (err) {
console.error(err);
return;
}
console.log('File has been saved!');
});同步写入
const fs = require('fs');
try {
fs.writeFileSync('/path/to/file', 'Hello World!');
console.log('File has been saved!');
} catch (err) {
console.error(err);
}使用流处理大文件
对于大文件,使用流(stream)来读取和写入可以更有效地管理内存。
fs.createReadStream()
fs.createReadStream() 创建一个可读流,用于从文件中逐块读取数据。
// www.javascriptcn.com code example
const fs = require('fs');
const readStream = fs.createReadStream('/path/to/largefile');
readStream.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data.`);
});
readStream.on('end', () => {
console.log('Finished reading the file.');
});
readStream.on('error', (err) => {
console.error('Error:', err);
});fs.createWriteStream()
fs.createWriteStream() 创建一个可写流,用于将数据逐块写入文件。
// www.javascriptcn.com code example
const fs = require('fs');
const writeStream = fs.createWriteStream('/path/to/largetofile');
writeStream.write('Hello World!\n', (err) => {
if (err) throw err;
console.log('Data written to file');
});
writeStream.end();
writeStream.on('finish', () => {
console.log('The file has been written');
});
writeStream.on('error', (err) => {
console.error('Error:', err);
});使用管道传输数据
管道(pipe)是流处理中的一个重要概念,它允许我们将一个流的数据输出到另一个流中,从而实现数据的高效传输。
// www.javascriptcn.com code example
const fs = require('fs');
const readStream = fs.createReadStream('/path/to/sourcefile');
const writeStream = fs.createWriteStream('/path/to/destinationfile');
readStream.pipe(writeStream);
readStream.on('error', (err) => {
console.error('Error:', err);
});
writeStream.on('error', (err) => {
console.error('Error:', err);
});实用库:fs-extra
fs-extra 是一个基于 fs 模块的扩展库,提供了一些额外的功能和改进的 API,使得文件操作更加方便。
安装 fs-extra
首先需要安装 fs-extra:
npm install fs-extra
使用 fs-extra
// www.javascriptcn.com code example
const fs = require('fs-extra');
// 复制文件
fs.copy('/path/to/sourcefile', '/path/to/destinationfile', (err) => {
if (err) return console.error(err);
console.log('success!');
});
// 移动文件
fs.move('/path/to/sourcefile', '/path/to/newfile', (err) => {
if (err) return console.error(err);
console.log('success!');
});
// 删除文件夹
fs.remove('/path/to/directory', (err) => {
if (err) return console.error(err);
console.log('success!');
});通过本章的学习,你应该能够掌握 Node.js 中基本的文件读取和写入操作,并且了解如何使用流和一些实用的库来提高文件处理的效率和便利性。