Javascript 不要使用节点js读取3级之后的目录
在特定的点或三级树结构之后,有没有办法停止读取目录 比如说Javascript 不要使用节点js读取3级之后的目录,javascript,node.js,async-await,promise,callback,Javascript,Node.js,Async Await,Promise,Callback,在特定的点或三级树结构之后,有没有办法停止读取目录 比如说 MainFolder -ABC Folder -DEF Folder -GHI Folder -image.png -jkl.gif 当我点击ABC文件夹时,我的路径将如下所示 如果其中有任何其他文件夹或文件,则看起来 /MainFolder/ABC Folder -PQR Folder -STU Folder -abc.pdf -xyz.txt 单击PQR文件夹,然后它将如下所示 /MainFolder/ABC Folder/PQ
MainFolder
-ABC Folder
-DEF Folder
-GHI Folder
-image.png
-jkl.gif
当我点击ABC文件夹时,我的路径将如下所示
如果其中有任何其他文件夹或文件,则看起来
/MainFolder/ABC Folder
-PQR Folder
-STU Folder
-abc.pdf
-xyz.txt
单击PQR文件夹,然后它将如下所示
/MainFolder/ABC Folder/PQR Folder
-DFC Folder
-HKJ Folder
-mnb.pdf
-xyz.txt
但不应读取DFC文件夹/HKJ文件夹或在三级树结构之后出现的任何其他文件夹
输出:-
["MainFolder/image.png",
"MainFolder/jkl.gif",
"MainFolder/ABC Folder/abc.pdf",
"MainFolder/ABC Folder/xyz.txt",
"MainFolder/ABC Folder/PQR Folder/mnb.pdf",
"MainFolder/ABC Folder/PQR Folder/xyz.txt"]
代码,我让它读取所有文件和子目录,但我想停止在3级目录
async function getAllFile(folderPath) {
let files = await fs.readdir(folderPath);
files = await Promise.all(
files.map(async (file) => {
const filePath = path.join(folderPath, file);
const stats = await fs.stat(filePath);
if (stats.isDirectory()) {
return getAllFile(filePath);
} else if (stats.isFile()) return filePath;
})
);
return files.reduce((all, folderContents) => all.concat(folderContents), []);
}
PS:使用节点10.16.3应该可以解决您的问题。我添加了depth参数,它基本上表示要遍历多少文件夹级别。在文件树的情况下,您可以使用深度2调用此函数:
getAllFile('./MainFolder/',2)
,因为您希望浏览根目录(级别1)和子文件夹(级别2),而不是子文件夹(级别3)中的文件夹
如果一个文件夹仍然未被探测,我也会返回null,否则会导致未定义的值。在返回之前,我过滤掉这些null
值
async function getAllFile(folderPath, depth) {
depth -= 1;
let files = await fs.readdir(folderPath);
files = await Promise.all(
files.map(async (file) => {
const filePath = path.join(folderPath, file);
const stats = await fs.stat(filePath);
if (stats.isDirectory() && depth > 0) {
return getAllFile(filePath, depth);
} else if (stats.isFile()) return filePath;
else return null;
})
);
return files.reduce((all, folderContents) => all.concat(folderContents), []).filter(e => e != null);
}
它不工作@fravolt仍在读取所有文件夹根不计入深度。深度(例如)0不应返回子文件夹的内容,而深度1应返回子文件夹,但不返回子文件夹。我更新了我的原始答案,并加入了我能理解的代码run@fravolt“请注意,对于我来说,fs.readdir和fs.stat函数不会返回,但需要一个回调函数,但这可能是我这边的版本不匹配(我在节点V12.18.3上)。”-您可以使用require('fs')).promissions
在节点v12上获得对fs
方法的许可版本的访问权。@fravolt我尝试了你的代码,但仍然获得了目录,但感谢你的帮助:-)@Aakash我刚刚提出了一个新的更好的解决方案。我自己用你的文件夹结构测试了这个,它看起来像预期的那样工作。请让我知道它是否有效!:D