2012-04-29 4 views
0

結果は私にとっては予期せぬものです。ディレクトリを検索してすべてのファイルとサブフォルダを取得しようとしていますが、サブディレクトリのサブディレクトリを扱う際に問題があります。関数自体は、指定されたフォルダ内のすべてのフォルダとすべてのファイルのすべての内容を検索し、フォルダ内のオブジェクトの1つがフォルダである場合に呼び出されるように設計されています。予期しない結果を与える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は、ファイルのフルパスではなく、ディレクトリ内のファイル名を返します。最後に、私はあなたがこれをやっている間にnode.jsスレッドをロックしないように、readdirの非同期バージョンを使うことをお勧めします。ここで

は、開始パスからフォルダやファイルのすべてを取得するためのいくつかのサンプルコードです:

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

関連する問題