节点:递归遍历目录
Node: Traversing directories in a recursion
我是 Node 的新手...我需要牢记 Node 的异步行为和回调结构。我现在在这里挣扎:
// REQUIRE --------------------------------------------------------------------
fs = require('fs');
path = require('path');
// FUNCTION readAllDirs -------------------------------------------------------
function readAllDirs(dir, result) {
if (!result) {
result = function() {};
};
fs.readdir(dir, function(err, list) {
if(err) { return result(err) };
list.forEach(function(file) {
var fullpath = path.resolve(dir, file);
fs.stat(fullpath, function(err, stat) {
if(err) { return result(err) };
if(stat && stat.isDirectory()) {
readAllDirs(fullpath);
//console.log('In: ' + fullpath);
result(null, fullpath);
}
});
});
});
}
// MAIN -----------------------------------------------------------------------
readAllDirs('/somedir', function(err, dirs) {
console.log(dirs);
});
我尝试遍历目录树。原则上该功能运行良好...只要我不回调而是在控制台上打印目录名称即可。所有文件夹和子文件夹都按预期出现。但是当我进行回调时,回调不会被调用以进行比第一级更深的递归。
请帮帮忙!谢谢大家!
你的问题在这里,在 if (stat ...)
分支内:
readAllDirs(fullpath);
您需要将提供的回调再次传递回递归:
readAllDirs(fullpath, result);
我是 Node 的新手...我需要牢记 Node 的异步行为和回调结构。我现在在这里挣扎:
// REQUIRE --------------------------------------------------------------------
fs = require('fs');
path = require('path');
// FUNCTION readAllDirs -------------------------------------------------------
function readAllDirs(dir, result) {
if (!result) {
result = function() {};
};
fs.readdir(dir, function(err, list) {
if(err) { return result(err) };
list.forEach(function(file) {
var fullpath = path.resolve(dir, file);
fs.stat(fullpath, function(err, stat) {
if(err) { return result(err) };
if(stat && stat.isDirectory()) {
readAllDirs(fullpath);
//console.log('In: ' + fullpath);
result(null, fullpath);
}
});
});
});
}
// MAIN -----------------------------------------------------------------------
readAllDirs('/somedir', function(err, dirs) {
console.log(dirs);
});
我尝试遍历目录树。原则上该功能运行良好...只要我不回调而是在控制台上打印目录名称即可。所有文件夹和子文件夹都按预期出现。但是当我进行回调时,回调不会被调用以进行比第一级更深的递归。
请帮帮忙!谢谢大家!
你的问题在这里,在 if (stat ...)
分支内:
readAllDirs(fullpath);
您需要将提供的回调再次传递回递归:
readAllDirs(fullpath, result);