Skip to content
On this page

fs-extra

简介

fs-extra 是 Node.js 内置 fs 模块的增强版,提供了更多的功能,如复制文件和目录、确保目录存在、删除目录等,并且所有方法都支持 Promise。

安装

bash
npm install fs-extra

基本使用

1. 导入模块

javascript
// 使用 Promise
const fs = require('fs-extra')

// 或者使用回调
const fs = require('fs-extra').callback

2. 基本操作

javascript
// 复制文件
await fs.copy('/tmp/myfile', '/tmp/mynewfile')

// 确保目录存在
await fs.ensureDir('/tmp/some/long/path')

// 删除目录
await fs.remove('/tmp/mydir')

// 读取 JSON 文件
const data = await fs.readJson('./package.json')

高级特性

1. 复制目录

javascript
// 复制目录及其内容
await fs.copy('/tmp/mydir', '/tmp/mynewdir', {
  overwrite: true,
  errorOnExist: false,
  dereference: true,
  preserveTimestamps: true,
})

2. 文件操作

javascript
// 确保文件存在
await fs.ensureFile('file.txt')

// 移动文件
await fs.move('/tmp/file', '/tmp/newfile')

// 写入 JSON
await fs.writeJson(
  './config.json',
  {
    name: 'fs-extra',
    version: '1.0.0',
  },
  {
    spaces: 2,
  },
)

3. 目录操作

javascript
// 清空目录
await fs.emptyDir('/tmp/some/dir')

// 确保符号链接
await fs.ensureSymlink('/tmp/file', '/tmp/link')

// 获取目录大小
const size = await fs.pathExists('/tmp/some/file')

最佳实践

  1. 错误处理

    javascript
    async function copyFiles() {
      try {
        await fs.copy('./src', './dest')
        console.log('复制成功')
      } catch (err) {
        console.error('复制失败:', err)
      }
    }
  2. 递归操作

    javascript
    async function processDir(dir) {
      try {
        await fs.ensureDir(dir)
        const files = await fs.readdir(dir)
        for (const file of files) {
          const filePath = path.join(dir, file)
          const stats = await fs.stat(filePath)
          if (stats.isDirectory()) {
            await processDir(filePath)
          }
        }
      } catch (err) {
        console.error('处理目录失败:', err)
      }
    }
  3. 原子操作

    javascript
    async function safeWrite(file, data) {
      const tempFile = `${file}.tmp`
      try {
        await fs.writeFile(tempFile, data)
        await fs.move(tempFile, file, { overwrite: true })
      } catch (err) {
        await fs.remove(tempFile)
        throw err
      }
    }

注意事项

  1. 所有操作都是异步的,记得使用 async/await 或 Promise
  2. 复制大文件时注意内存使用
  3. 递归操作时要注意文件系统限制
  4. 在生产环境中要小心使用删除操作
  5. 注意文件权限问题

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命