在Node.js的世界里,文件操作是日常开发不可或缺的一部分。虽然Node.js内置的fs
(文件系统)模块提供了基本的文件读写能力,但在实际开发中,我们往往需要更多的功能和更简洁的API。这时候,fs-extra
包就像是一把瑞士军刀,为我们提供了强大而便捷的文件操作工具。
fs-extra
是对标准fs
模块的扩展,它不仅包含了所有原生fs
模块的方法,而且还添加了许多实用的功能,如复制、移动、删除文件/目录等。这些方法都支持Promise,使得我们可以用同步或异步的方式轻松处理文件。
其核心优势在于:
首先,确保你已经在项目中安装了fs-extra
:
npm install fs-extra
安装完成后,就可以在你的项目中引入并使用它了。
想要复制文件或目录,不必再手动创建目标路径,fs-extra
让一切变得简单:
const fse = require('fs-extra');
// 异步复制文件
// '/path/to/source' 是源文件或目录的路径,而 '/path/to/dest' 是目标路径
fse.copy('/path/to/source', '/path/to/dest')
.then(() => console.log('复制成功!'))
.catch(err => console.error(err));
// 同步复制文件
try {
fse.copySync('/path/to/source', '/path/to/dest');
console.log('复制成功!');
} catch (err) {
console.error(err);
}
移动文件或目录也是一样的简单:
// `'/path/to/source'` 是源文件或目录的路径,而 `'/path/to/dest'` 是目标路径
fse.move('/path/to/source', '/path/to/dest')
.then(() => console.log('移动成功!'))
.catch(err => console.error(err));
// 同步移动
try {
fse.moveSync('/path/to/source', '/path/to/dest');
console.log('移动成功!');
} catch (err) {
console.error(err);
}
使用fs-extra
删除文件或目录,无需担心目录是否为空:
// 异步删除
fse.remove('/path/to/dir')
.then(() => console.log('删除成功!'))
.catch(err => console.error(err));
// 同步删除
try {
fse.removeSync('/path/to/dir');
console.log('删除成功!');
} catch (err) {
console.error(err);
}
处理JSON文件也变得异常简单:
// 异步读取JSON文件
fse.readJson('/path/to/config.json')
.then(config => {
console.log(config);
})
.catch(err => console.error(err));
// 同步读取JSON文件
try {
const config = fse.readJsonSync('/path/to/config.json');
console.log(config);
} catch (err) {
console.error(err);
}
// 异步写入JSON文件
fse.writeJson('/path/to/config.json', { name: 'fs-extra' })
.then(() => console.log('写入成功!'))
.catch(err => console.error(err));
// 同步写入JSON文件
try {
fse.writeJsonSync('/path/to/config.json', { name: 'fs-extra' });
console.log('写入成功!');
} catch (err) {
console.error(err);
}
fs-extra
的所有异步方法都返回一个Promise,这意味着你可以使用async/await
来处理更复杂的异步逻辑:
const processFiles = async () => {
try {
await fse.copy('/path/to/source', '/path/to/dest');
console.log('文件复制完成');
const data = await fse.readJson('/path/to/config.json');
console.log('配置读取完成', data);
// ...更多异步操作
} catch (err) {
console.error('出错了', err);
}
};
processFiles();
const data = await fse.readFile('./file.txt', 'utf8');
console.log(data);
await fse.writeFile('./file.txt', 'Hello, fs-extra!');
const config = await fse.readJson('./config.json');
console.log(config);
await fse.writeJson('./config.json', { key: 'value' }, { spaces: 2 });
await fse.mkdirs('./path/to/new/directory');
const files = await fse.readdir('./directory');
console.log(files);
await fs.remove('./directory');
fs.ensureDir('/path/to/directory')
.then(() => console.log('Directory ensured'))
.catch(err => console.error(err));
// 在上面的示例中,如果 `/path/to/directory` 不存在,`ensureDir` 会创建它。同时,如果 `/path/to` 目录也不存在,它也会被创建。这样可以确保整个目录路径都存在。
fs.ensureFile('/path/to/file.txt')
.then(() => console.log('File ensured'))
.catch(err => console.error(err));
// 如果 `/path/to/file.txt` 不存在,`ensureFile` 会创建它。同时,如果 `/path/to` 目录也不存在,它也会被创建。这样可以确保整个文件路径都存在。
// 同步的使用方式:
fs.ensureFileSync('/path/to/file.txt');
fs.ensureDirSync('/path/to/directory');
await fse.emptyDir('./directory');
true
,如果路径不存在,promise会resolve为false
。。
fse.pathExists('/path/to/file')
.then(exists => console.log(exists)) // true or false
.catch(err => console.error(err));
//也可以使用同步版本`pathExistsSync`,它会直接返回一个布尔值,表示路径是否存在:
const exists = fs.pathExistsSync('/path/to/file'); // true or false
console.log(exists);
path
模块,用于路径相关操作。const filePath = fse.path.join('dir', 'file.txt');
const readStream = fse.createReadStream('./large-file.bin');
const writeStream = fse.createWriteStream('./output.bin');
readStream.pipe(writeStream);
还有更多API可以参考官网