Nodejs readdir - 只查找文件

Nodejs readdir - only find files

读取目录时,我目前有这个:

  fs.readdir(tests, (err, items) => {

      if(err){
        return cb(err);
      }

      const cmd = items.filter(v => fs.lstatSync(tests + '/' + v).isFile());

      k.stdin.end(`${cmd}`);
  });

首先,我需要 fs.lstatSync 周围有一个 try/catch,我不想添加它。 但是有没有办法使用fs.readdir只查找文件?

类似于:

fs.readdir(tests, {type:'f'}, (err, items) => {});

有人知道怎么做吗?

不幸的是,fs.readdir 没有指定您只查找文件的选项,而不是 folders/directories(根据文档)。过滤 fs.readdir 的结果以剔除目录是最好的选择。

https://nodejs.org/dist/latest-v10.x/docs/api/fs.html#fs_fs_readdir_path_options_callback

The optional options argument can be a string specifying an encoding, or an object with an encoding property specifying the character encoding to use for the filenames passed to the callback. If the encoding is set to 'buffer', the filenames returned will be passed as Buffer objects.

是的fs.readdir目前不能这样做(只能读取文件或只能读取目录)。

我用 Node.js 提交了一个问题,看起来它可能是一个可以添加的好功能。

https://github.com/nodejs/node/issues/21804

从节点 v10.10.0 开始,您可以添加 withFileTypes 作为选项参数来获取 fs.Dirent 而不是字符串。

// or readdir to get a promise
const subPaths = fs.readdirSync(YOUR_BASE_PATH, { 
  withFileTypes: true
});
// subPaths is fs.Dirent[] type
const directories = subPaths.filter((dirent) => dirent.isFile());
// directories is string[] type

更多信息位于节点文档中:

如果您的用例是 scripting/automation。您可以尝试 fs-jetpack 库。它可以为您在文件夹中查找文件,但也可以配置为进行更复杂的搜索。

const jetpack = require("fs-jetpack");

// Find all files in my_folder
const filesInFolder = jetpack.find("my_folder", { recursive: false }));
console.log(filesInFolder);

// Example of more sophisticated search:
// Find all `.js` files in the folder tree, with modify date newer than 2020-05-01
const borderDate = new Date("2020-05-01")
const found = jetpack.find("foo", {
  matching: "*.js",
  filter: (file) => {
    return file.modifyTime > borderDate
  }
});
console.log(found);