Javascript 使用nodejs递归获取目录中的所有目录
我想让给定目录中的所有目录同步Javascript 使用nodejs递归获取目录中的所有目录,javascript,node.js,recursion,directory,path,Javascript,Node.js,Recursion,Directory,Path,我想让给定目录中的所有目录同步 <MyFolder> |- Folder1 |- Folder11 |- Folder12 |- Folder2 |- File1.txt |- File2.txt |- Folder3 |- Folder31 |- Folder32 这是我的代码: const fs = require('fs'); const path = require('pat
<MyFolder>
|- Folder1
|- Folder11
|- Folder12
|- Folder2
|- File1.txt
|- File2.txt
|- Folder3
|- Folder31
|- Folder32
这是我的代码:
const fs = require('fs');
const path = require('path');
function flatten(lists) {
return lists.reduce((a, b) => a.concat(b), []);
}
function getDirectories(srcpath) {
return fs.readdirSync(srcpath)
.map(file => path.join(srcpath, file))
.filter(path => fs.statSync(path).isDirectory());
}
function getDirectoriesRecursive(srcpath) {
return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))];
}
有人能帮我解决上面的问题吗?你就快到了,你只需要避免
文件(不是目录),这样getDirectoriesRecursive(srcpath)
函数递归就不会抛出错误
这是最终的getdirectoriescursive
代码:
function getDirectoriesRecursive(srcpath) {
return [srcpath, ...flatten(getDirectories(srcpath).map((p) => {
try {
if (fs.existsSync(path)) {
if (fs.lstatSync(path).isDirectory()) {
return getDirectoriesRecursive(path);
}
}
} catch (err) {
console.error(err)
}
}).filter(p => p !== undefined))];
}
这是为了显示“/opt”
async
这是一个高度优化的版本,使用节点的快速对象。这种方法允许您跳过每个路径上昂贵的fs.existsSync
和fs.statSync
调用-
const { readdir } =
require ("fs/promises")
const { join } =
require ("path")
const dirs = async (path = ".") =>
Promise.all
( (await readdir (path, { withFileTypes: true }))
.map
( dirent =>
dirent .isDirectory ()
? dirs (join (path, dirent.name))
: []
)
)
.then
( results =>
[] .concat (path, ...results)
)
你是这样用的-
dirs ("MyFolder") .then (console.log, console.error)
console .log (dirsSync ("MyFolder"))
同步
我们可以使用同步函数重写上述函数-
const { readdirSync } =
require ("fs")
const { join } =
require ("path")
const dirsSync = (path = ".") =>
[].concat
( path
, ...readdirSync (path, { withFileTypes: true })
.map
( dirent =>
dirent .isDirectory ()
? dirsSync (join (path, dirent.name))
: []
)
)
你是这样用的-
dirs ("MyFolder") .then (console.log, console.error)
console .log (dirsSync ("MyFolder"))
通过使用Array.prototype.flatMap
-
const { readdirSync } =
require ("fs")
const { join } =
require ("path")
const dirsSync = (path = ".") =>
[ path
, ...readdirSync (path, { withFileTypes: true })
.flatMap
( dirent =>
dirent .isDirectory ()
? dirsSync (join (path, dirent.name))
: []
)
]
您需要格式化返回数组中的元素,对其进行迭代并对元素进行格式化,然后从格式化后的元素创建新数组以获得结果getDirectoriesRecursive()函数似乎工作得相当好。。也许你可以详细说明你到底出了什么问题?当我运行代码时,我得到输出:['.\\','Folder1','Folder1\\Folder11','Folder1\\Folder12','Folder2','Folder3','Folder3\\Folder31','Folder3\\Folder32']