深入浅出fs-extra:Node.js文件操作的瑞士军刀

在Node.js的世界里,文件操作是日常开发不可或缺的一部分。虽然Node.js内置的fs(文件系统)模块提供了基本的文件读写能力,但在实际开发中,我们往往需要更多的功能和更简洁的API。这时候,fs-extra包就像是一把瑞士军刀,为我们提供了强大而便捷的文件操作工具。

1,为什么选择fs-extra?

fs-extra是对标准fs模块的扩展,它不仅包含了所有原生fs模块的方法,而且还添加了许多实用的功能,如复制、移动、删除文件/目录等。这些方法都支持Promise,使得我们可以用同步或异步的方式轻松处理文件。

其核心优势在于:

  • Promise 支持:所有方法都返回 Promise,便于使用 async/await 进行异步编程。
  • 简化路径处理:内置路径拼接、路径规范化等辅助函数。
  • 更丰富的 API:提供了一些 fs 没有的高级文件/目录操作方法。

2,快速上手

首先,确保你已经在项目中安装了fs-extra

js 复制代码
npm install fs-extra

安装完成后,就可以在你的项目中引入并使用它了。

文件复制

想要复制文件或目录,不必再手动创建目标路径,fs-extra让一切变得简单:

js 复制代码
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);
}

文件移动

移动文件或目录也是一样的简单:

js 复制代码
// `'/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删除文件或目录,无需担心目录是否为空:

js 复制代码
// 异步删除
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文件也变得异常简单:

js 复制代码
// 异步读取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);
}

异步操作与Promise

fs-extra的所有异步方法都返回一个Promise,这意味着你可以使用async/await来处理更复杂的异步逻辑:

js 复制代码
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();

文件读写

  • readFile:读取文件内容。
javascript 复制代码
const data = await fse.readFile('./file.txt', 'utf8');
console.log(data);
  • writeFile:写入文件内容。
javascript 复制代码
await fse.writeFile('./file.txt', 'Hello, fs-extra!');
  • readJsonwriteJson:读写 JSON 文件。
javascript 复制代码
const config = await fse.readJson('./config.json');
console.log(config);

await fse.writeJson('./config.json', { key: 'value' }, { spaces: 2 });

目录操作

  • mkdirs (或 mkdirp):创建多级目录。
javascript 复制代码
await fse.mkdirs('./path/to/new/directory');
  • readdir:读取目录内容。
javascript 复制代码
const files = await fse.readdir('./directory');
console.log(files);
  • remove:删除文件或目录(递归删除)。
javascript 复制代码
await fs.remove('./directory');
  • ensureFileensureDir:确保文件或目录存在,如果不存在则创建。
javascript 复制代码
await fse.ensureFile('./path/to/new/file.txt');
await fse.ensureDir('./path/to/new/directory');
  • emptyDir:清空目录。
javascript 复制代码
await fse.emptyDir('./directory');

其他实用功能

  • path 属性:访问内置的 path 模块,用于路径相关操作。
javascript 复制代码
const filePath = fse.path.join('dir', 'file.txt');
  • createReadStreamcreateWriteStream:创建可读/可写流,适用于大文件操作。
javascript 复制代码
const readStream = fse.createReadStream('./large-file.bin');
const writeStream = fse.createWriteStream('./output.bin');

readStream.pipe(writeStream);

还有更多API可以参考官网

相关推荐
Wyc724097 分钟前
HTML:入门
前端·html
Sunny_lxm7 分钟前
自定义列甘特图,原生开发dhtmlxgantt根特图,根据数据生成只读根特图,页面展示html demo
前端·html·甘特图·dhtmlxgantt
熊猫钓鱼>_>1 小时前
建筑IT数字化突围:建筑设计企业的生存法则重塑
前端·javascript·easyui
赵大仁2 小时前
Deno、Bun、Node.js 性能对比与选型指南
node.js
GISer_Jing3 小时前
前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读
前端·javascript·vue
不知几秋3 小时前
数字取证-内存取证(volatility)
java·linux·前端
水银嘻嘻5 小时前
08 web 自动化之 PO 设计模式详解
前端·自动化
Zero1017136 小时前
【详解pnpm、npm、yarn区别】
前端·react.js·前端框架
&白帝&7 小时前
vue右键显示菜单
前端·javascript·vue.js
Wannaer7 小时前
从 Vue3 回望 Vue2:事件总线的前世今生
前端·javascript·vue.js