大家晚安。我可能遇到一些简单的递归函数问题。问题是以递归方式列出给定文件夹中的所有文件。
目前,我已经设法使用一个简单的函数列出目录中的文件:
fs.readdirSync(copyFrom).forEach(file => {
let fullPath = path.join(copyFrom, file);
if (fs.lstatSync(fullPath).isDirectory()) {
console.log(fullPath);
} else {
console.log(fullPath);
} });
我尝试了各种方法,例如do{} ... while()
,但我无法做到正确
由于我是javascript的初学者,我终于决定向你们寻求帮助。
提前感谢您的宝贵帮助。
答案 0 :(得分:10)
只需添加一个递归调用即可完成:
function traverseDir(dir) {
fs.readdirSync(dir).forEach(file => {
let fullPath = path.join(dir, file);
if (fs.lstatSync(fullPath).isDirectory()) {
console.log(fullPath);
traverseDir(fullPath);
} else {
console.log(fullPath);
}
});
}
答案 1 :(得分:1)
以这种方式使用console.log
会显示路径,这很棒,但如果您想对路径做一些更有意义的事情呢?例如,您可能希望在数组中收集所有这些数据并将其传递给其他地方进行处理......
在状态更改时以种子状态开始并扩展值序列的此过程称为unfold
。
const { join } =
require ('path')
const { readdirSync, statSync } =
require ('fs')
const unfold = (f, initState) =>
f ( (value, nextState) => [ value, ...unfold (f, nextState) ]
, () => []
, initState
)
const None =
Symbol ()
const relativePaths = (path = '.') =>
readdirSync (path) .map (p => join (path, p))
const traverseDir = (dir) =>
unfold
( (next, done, [ path = None, ...rest ]) =>
path === None
? done ()
: next ( path
, statSync (path) .isDirectory ()
? relativePaths (path) .concat (rest)
: rest
)
, relativePaths (dir)
)
console.log (traverseDir ('.'))
// [ a, a/1, a/1/1, a/2, a/2/1, a/2/2, b, b/1, ... ]
如果这是您第一次看到这样的节目,unfold
会感到非常压倒性。下面是用于生成小写unfold
alphabet
的简化示例
const unfold = (f, init) =>
f ( (x, next) => [ x, ...unfold (f, next) ]
, () => []
, init
)
const nextLetter = c =>
String.fromCharCode (c.charCodeAt (0) + 1)
const alphabet =
unfold
( (next, done, c) =>
c > 'z'
? done ()
: next ( c // value to add to output
, nextLetter (c) // next state
)
, 'a' // initial state
)
console.log (alphabet)
// [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z ]

如果您仍然卡住了,我在此处演示的技巧会在类似问题的答案中得到更详细的解释
通常,首选使用fs
模块中的异步函数,因为这可以防止程序在长磁盘读取时间或网络延迟时挂起。正如在其他Q& A&#39中所展示的那样,展开与异步一起很好地发挥作用