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 提交了一个问题,看起来它可能是一个可以添加的好功能。
从节点 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);
读取目录时,我目前有这个:
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 anencoding
property specifying the character encoding to use for the filenames passed to the callback. If theencoding
is set to'buffer'
, the filenames returned will be passed asBuffer
objects.
是的fs.readdir
目前不能这样做(只能读取文件或只能读取目录)。
我用 Node.js 提交了一个问题,看起来它可能是一个可以添加的好功能。
从节点 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);