Node.js | 多文件同步异步读写 简单应用

1,733 阅读1分钟

概述

node 读写是常见的需求,本文对读、同步写、异步写 简单应用

读取文件夹下所有目录

/**
 * 读取文件夹下所有目录
 * input 文件夹路径,该参数用于递归使用,初次调用与inputUrl相同
 * list 储存目录的数组
 * inputUrl 文件夹路径
 **/
function readAllFilesSync(input, list, inputUrl) {
  // 同步获取文件夹下所有目录
  const files = fs.readdirSync(input);
  //   勋魂
  for (let i = 0; i < files.length; i++) {
    const file = files[i];
    // 获取目录状态
    const stats = fs.statSync(input + file);
    // 该目录是否是文件
    if (stats.isFile()) {
      // 是则存储该目录
      list.push(input.replace(inputUrl, "") + file);
    } else {
      // 不是文件,是文件夹,则递归调用该方法
      readAllFilesSync(input + file + "/", list, inputUrl);
    }
  }
}

读取文件我采用的是同步读取,异步的话也可以,使用 fs.readdir()

写文件

如果你一次性写文件过多的话,会出现打开文件过多的错误,我查阅了一些解决办法,基本都是在系统中改变同时打开最大文件的数量,所以我便采用了同步读写,至于效率,这是一个尴尬的问题,文件数量少,看不到效率差异,文件数量多,异步读写又会出现前面所说的问题。当然,提高效率可以采用多进程方式提升,可参考我写的另一篇博客

异步

/**
 * 异步写文件
 * input 读取的文件夹目录
 * output 写入目录
 * list 文件数组
 **/
function writeFiles(input, output, list) {
  for (const file of list) {
    //  获取文件相对于 input 的相对路径
    let fileDir = file.split("/");
    fileDir.splice(fileDir.length - 1, 1);
    fileDir = fileDir.join("/");
    const url = output + fileDir;
    // 根据目录创建文件夹
    fs.mkdir(url, { recursive: true }, () => {
      // 读文件
      fs.readFile(input + file, (err, res) => {
        // 获取的res为buffer,可以使用转换其格式,然后对读取的内容进行修改
        // 写文件
        fs.writeFile(output + file, res, (err) => {
          if (err) console.log(err);
        });
      });
    });
  }
}

同步

/**
 * 同步写文件
 * input 读取的文件夹目录
 * output 写入目录
 * list 文件数组
 **/
function writeFilesSync(input, output, list) {
  // 计时
  console.time();
  for (let i = 0; i < list.length; i++) {
    // 获取相对路径
    const file = list[i];
    let fileDir = file.split("/");
    fileDir.splice(fileDir.length - 1, 1);
    fileDir = fileDir.join("/");
    const url = output + fileDir;
    // 创建目录文件夹
    fs.mkdirSync(url, { recursive: true });
    // 读文件
    const res = fs.readFileSync(input + file);
    // 写文件
    fs.writeFileSync(output + file, res);
    // 计时结束
    if (i === list.length - 1) console.timeEnd();
  }
}

总结

多文件读写本身并不难,但是还是有很多坑去踩,如果你需要提高读写效率,请参考我的另一篇文章。 欢迎来到我的个人博客