fs 文件系统模块
在Node.js开发中,处理文件和目录是一项常见的任务。幸运的是,Node.js提供了一个名为fs
(文件系统)的核心模块,使得读取、写入、更新和删除文件变得简单而强大。本文将带你深入了解fs
模块的基础知识、主要功能以及如何利用它来实现文件操作。
什么是fs
模块?
fs
模块是Node.js提供的一个内置模块,用于与计算机的文件系统进行交互。通过该模块,开发者能够执行诸如创建、读取、更新和删除文件等操作。fs
模块提供了两种风格的API:同步和异步,以满足不同的需求。
异步 vs 同步
- 异步API:非阻塞式的,适合于需要处理大量并发请求的场景。通常接受一个回调函数作为最后一个参数,在操作完成时调用。
- 同步API:阻塞式的,适用于简单的脚本或不需要考虑性能的情况。它们直接返回结果而不是使用回调函数。
安装与引入
由于fs
是Node.js的核心模块之一,因此无需单独安装。只需在你的JavaScript文件中使用require
语句引入即可:
const fs = require('fs');
基本操作
接下来,我们将介绍一些常用的文件操作,并展示如何使用fs
模块实现这些操作。
读取文件
使用fs.readFile()
异步读取文件内容,或者使用fs.readFileSync()
同步读取。
异步读取
fs.readFile('./example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
同步读取
try {
const data = fs.readFileSync('./example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
写入文件
使用fs.writeFile()
异步写入数据到文件,或者使用fs.writeFileSync()
同步写入。
异步写入
fs.writeFile('./output.txt', 'Hello Node.js!', err => {
if (err) throw err;
console.log('The file has been saved!');
});
同步写入
try {
fs.writeFileSync('./output.txt', 'Hello Node.js!');
console.log('The file has been saved!');
} catch (err) {
console.error(err);
}
追加内容到文件
使用fs.appendFile()
可以在不覆盖现有内容的情况下向文件添加新数据。
fs.appendFile('./output.txt', '\nAppending new line.', err => {
if (err) throw err;
console.log('The "data to append" was appended to file!');
});
删除文件
使用fs.unlink()
可以从文件系统中删除文件。
fs.unlink('./output.txt', err => {
if (err) throw err;
console.log('File deleted!');
});
创建目录
使用fs.mkdir()
可以创建新的目录。
fs.mkdir('./newDir', { recursive: true }, err => {
if (err) throw err;
console.log('Directory created!');
});
删除目录
使用fs.rmdir()
可以删除一个空目录;如果要删除包含文件的目录,则需要先删除其中的所有文件。
fs.rmdir('./newDir', { recursive: true }, err => {
if (err) throw err;
console.log('Directory deleted!');
});
使用流处理大文件
对于特别大的文件,直接读取整个文件可能会导致内存问题。这时,我们可以使用fs.createReadStream()
和fs.createWriteStream()
来分块处理文件。
从文件读取并写入另一个文件
const readStream = fs.createReadStream('./largeFile.txt');
const writeStream = fs.createWriteStream('./copyOfLargeFile.txt');
readStream.on('data', chunk => {
writeStream.write(chunk);
});
readStream.on('end', () => {
console.log('File copied successfully.');
});
结合Promises和Async/Await
为了简化错误处理和代码结构,可以结合使用Promises和async/await语法糖来替代传统的回调函数。
使用Promises封装
const fsPromises = fs.promises;
async function readFileAsync(path) {
try {
const data = await fsPromises.readFile(path, 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
readFileAsync('./example.txt');
结语
感谢您的阅读!如果你有任何问题或想分享自己的经验,请在评论区留言交流!