2012-04-29 111 views
0

那麼結果對我而言至少是意外的。我試圖通過目錄搜索並獲取所有文件和子文件夾,但是我在處理子目錄的子目錄時遇到了一些問題。該功能本身旨在查找給定文件夾內所有文件夾和所有文件的所有內容,並在文件夾內的其中一個文件夾是文件夾時調用它自己。node.js中的遞歸函數給出了意想不到的結果

但是,它永遠不會完成,它始終將相同的文件夾放入自己的文件夾中,從不做任何事情,最終只會崩潰。

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); 

回答

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'); 
+0

啊感謝,再次我不知道所有的功能。我使用同步版本的readdir的唯一原因是因爲我打算在服務器啓動之前啓動該功能,然後爲其提供所有文件和文件夾的數組。 – Hallucigenia95 2012-04-29 11:42:01

相關問題