2016-12-22 7 views
0

ディレクトリの束をループして、そのディレクトリ内のファイルがNodeJSとfs.stat()で存在するかどうか試してみます。FORループでNodeJS - fs.stat()が無視される

私は、ディレクトリ上でループするための単純なループを持っており、fs.stat()呼び出しでその特定のディレクトリ内の "project.xml"が存在するかどうかを確認します。私のコードは次のようになります。

for (var i = 0, length = prDirs.length; i < length; i++) { 
    var path = Config["ProjectDirectory"] + "/" + prDirs[i]; 
    console.log("PATH=" + path); 
    fs.stat(path + "/project.xml", function (err, stat) { 
    if (err == null) { 
     console.log(" => PATH=" + path); 
    } 
    }) 
} 

NodeJSは、ディレクトリ上で正しくループし、console.log()出力全て正しくディレクトリが、内のコード内のfs.statは()と呼ばれ、最後に一度だけ実行されていない場合ループの私のコンソールはこれを示しています

PATH=(...)/PHP 
PATH=(...)/Electron 
PATH=(...)/testapp 
PATH=(...)/Vala 
    => PATH=(...)/Vala/project.xml 

は、しかし、私が探しているのproject.xmlはVala/ないtestapp/であるが、Vala/prDirsの最後のエントリです。

上記のコードは私の最新の試みですが、私はfs.stat()が実際にが呼び出されることを、私を示したが、内部のコードだけ(私はfs.stat()内部ifelseを追加)他のバリエーションと1の多くを試してみましたifが実行されておらず、elseのコードが一度追加されました。は、実行中はでした。

ありがとうございます!

+0

すぐに修正するには、 'var'の代わりに' let'を使うことですが、最終的には非同期関数呼び出しを読む価値があります。 – robertklep

答えて

0

fs.statは非同期入出力関数なので、コールバックはメインスレッドがアイドル状態になった後、またはあなたのケースではforループが完了した後にのみ呼び出されます。 forループの代わりに、私は非同期の問題でフォルダを反復することを推奨します。 async.eachasync.eachSeriesを使用するか、自分で実装することができます。

0

as @Gil Zはfs.stat asyncで指定します。私はpromisesを使用して、それぞれのループを維持してコードルックを同期させることをお勧めします。

これは例です。ノードv 6.9

"use strict"; 
const fs = require('fs'); 
let paths = ["tasks", "aaa", "bbbb"]; 
//method to get stat data using promises 
function checkFileExists(path) { 
    return new Promise((resolve, reject) => { 
     fs.stat(path + "/project.xml", (err, res) => { 
      resolve(err ? "Not found in " + path : " => PATH=" + path); 
     }); 
    }); 
} 
//create promise array with each directory 
let promiseArr = []; 
paths.forEach(pathPart => { 
    let path = process.cwd() + "/" + pathPart; 
    promiseArr.push(checkFileExists(path)); 
}); 
//run all promises and collect results 
Promise.all(promiseArr) 
.then(reslut => { 
    console.log(reslut); 
}) 
.catch(e => console.log("Error in promises")); 

上の作品は、上記のコードは、このことができます。この

[ ' => PATH=/Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/tasks', 
    'Not found in /Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/aaa', 
    'Not found in /Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/bbbb' ] 

希望をログに記録します。

関連する問題