node.js中的递归函数给出意外结果

时间:2012-04-29 02:31:53

标签: node.js recursion

至少对我来说结果是出乎意料的。我正在尝试搜索目录并获取所有文件和子文件夹,但是我在处理子目录的子目录时遇到了一些问题。该函数本身用于查找给定文件夹中所有文件夹和所有文件的所有内容,并在文件夹中的某个内容为文件夹时调用自身。

然而,它永远不会完成,它会继续将相同的文件夹送入自身,并且从不对它做任何事情,最终只是崩溃。

var fs = require('fs');

var array = fs.readdirSync(__dirname);
function getAllSub(array){
for (i = 0; i < array.length; i++){
    if (array[i].indexOf(".") == (-1))
        {                     
            array = array.concat(array[i] + "/" + fs.readdirSync(__dirname + "/" +    array[i]));
        }
    if (array[i].indexOf("/") != (-1)){
        var foldcon = array[i].substr(array[i].indexOf("/") + 1);
        var folder = array[i].substr(0, array[i].indexOf("/"));
        foldcon = foldcon.split(",");
        for (n = 0; n < foldcon.length; n++){
            foldcon[n] = folder + "/" + foldcon[n]
            if (foldcon[n].indexOf(".") == (-1)){ 
                console.log([foldcon[n]]);
                foldcon[n] = getAllSub([foldcon[n]]);          

            }
        }
        array.splice(i, 1, foldcon);

    }

}


return array;
}
array = getAllSub(array);
console.log(array);

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。您应该使用fs.stat调用来获取有关文件的信息,以确定它们是目录还是文件,解析路径本身确实容易出错。此外,readdir只返回目录中文件的名称,而不是文件的完整路径。最后,我建议您使用readdir的异步版本,以便在执行此操作时不会锁定node.js线程。

以下是从起始路径获取所有文件夹和文件的示例代码:

var parseDirectory = function (startPath) {
  fs.readdir(startPath, function (err, files) {
    for(var i = 0, len = files.length; i < len; i++) {
      checkFile(startPath + '/' + files[i]);
    }
  });
};

var checkFile = function (path) {
  fs.stat(path, function (err, stats) {
    if (stats.isFile()) {
      console.log(path + ' is a file.');
    }
    else if (stats.isDirectory()) {
      console.log(path + ' is a directory.');
      parseDirectory(path);
    }
  });
};


parseDirectory(__dirname + '/../public');