node环境文件操作函数封装

1,591 阅读3分钟

node环境文件操作函数封装

在Node.js环境下,经常需要对文件和文件夹进行操作,例如复制、删除等。为了更方便地进行这些操作,可以封装一些函数来简化代码。

复制文件夹函数

copyFolder函数用于复制一个文件夹到指定路径。

参数

  • copiedPath:要复制的文件夹的路径。
  • resultPath:复制后的目标路径。

操作步骤

  1. 创建目标文件夹:使用fs.mkdirSync函数在指定路径下创建目标文件夹。
  2. 获取源文件夹中的所有文件和文件夹:使用fs.readdirSync函数读取源文件夹中的所有文件和文件夹。
  3. 遍历源文件夹中的文件和文件夹:
    • 如果是文件,使用流的形式创建文件,并将源文件内容写入目标文件。
    • 如果是文件夹,递归调用copyFolder函数,继续复制文件夹中的内容到目标文件夹。

该函数利用了fs模块提供的createReadStreamcreateWriteStream函数,可以处理大文件的读写。另外,使用path模块的join函数来拼接路径。

const copyFolder = (copiedPath, resultPath) => {
  function createDir(dirPath) {
    fs.mkdirSync(dirPath);
  }
  if (fs.existsSync(copiedPath)) {
    createDir(resultPath);
    const files = fs.readdirSync(copiedPath, { withFileTypes: true });
    for (let i = 0; i < files.length; i += 1) {
      const cf = files[i];
      const ccp = path.join(copiedPath, cf.name);
      const crp = path.join(resultPath, cf.name);
      if (cf.isFile()) {
        // 创建文件,使用流的形式可以读写大文件
        const readStream = fs.createReadStream(ccp);
        const writeStream = fs.createWriteStream(crp);
        readStream.pipe(writeStream);
      } else {
        try {
          fs.accessSync(path.join(crp, ".."), fs.constants.W_OK);
          copyFolder(ccp, crp, true);
        } catch (error) {
          console.log("folder write error:", error);
        }
      }
    }
  } else {
    console.log("do not exist path: ", copiedPath);
  }
};

删除文件夹函数

deleteFolder函数用于递归地删除指定路径下的所有文件和文件夹。

参数

  • path:要删除的文件夹的路径。

操作步骤

  1. 判断路径是否存在:使用fs.existsSync函数判断指定路径是否存在。
  2. 如果路径存在,获取路径下的所有文件和文件夹:使用fs.readdirSync函数读取路径下的所有文件和文件夹。
  3. 遍历文件和文件夹:
    • 如果是文件夹,递归调用deleteFolder函数,删除文件夹内的内容。
    • 如果是文件,直接使用fs.unlinkSync函数删除文件。
  4. 最后,使用fs.rmdirSync函数删除当前文件夹。
const deleteFolder = (path) => {
  let files = [];
  if (fs.existsSync(path)) {
    files = fs.readdirSync(path);
    files.forEach(function (file, _) {
      let curPath = path + "/" + file;
      if (fs.statSync(curPath).isDirectory()) {
        // 递归删除子文件夹
        deleteFolder(curPath);
      } else {
        // 删除文件
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
};

递归删除文件夹函数

rmdir函数用于递归删除指定路径下的所有文件和文件夹。

参数

  • filePath:要删除的文件夹或文件的路径。
  • callback:删除完成后的回调函数。

操作步骤

  1. 首先判断filePath的类型(文件还是文件夹):使用fs.stat函数获取文件或文件夹的信息。
  2. 如果是文件,直接使用fs.unlink函数删除文件。
  3. 如果是文件夹,通过fs.readdir函数获取文件夹中的所有内容,返回一个数组。
  4. 将数组中每个元素与filePath拼接,得到子文件夹或子文件的路径。
  5. 使用递归方式调用rmdir函数,递归删除子文件夹或子文件。
  6. 最后使用fs.rmdir函数删除当前文件夹。
const rmdir = (filePath, callback) => {
  fs.stat(filePath, function (err, stat) {
    if (err) return console.log(err);
    if (stat.isFile()) {
      fs.unlink(filePath, callback);
    } else {
      fs.readdir(filePath, function (err, data) {
        if (err) return console.log(err);
        let dirs = data.map((dir) => path.join(filePath, dir));
        let index = 0;
        !(function next() {
          if (index === dirs.length) {
            fs.rmdir(filePath, callback);
          } else {
            rmdir(dirs[index++], next);
          }
        })();
      });
    }
  });
};