1

パスからファイルとディレクトリのすべての名前を取得し、それらをファイルとディレクトリとして認識したい。しかし、コードを実行すると、動作することもあれば、ディレクトリがファイルであることが示されることもあります。ここにコードがあります

socket.on('data',function(path){
  fs.readdir('path',function(err, data) {
    var filestatus=[];
    var z=0;
    var i=data.length-1;

    data.forEach(function(file){ 
      fs.stat(file, function(err, stats) {  
        filestatus[z]=stats.isDirectory()
        if (z==i){
          socket.emit('backinfo',{names:data,status:filestatus});
        }
        z++;
      })
    })
  })  
})

テスト中に、data.forEach ループを遅くすると (console.log(something) を使用して) うまく機能する (ミスが少なくなる) ことに気付きました。これは奇妙です。

4

2 に答える 2

1

これは約96%正しくありません。私の間違いを指摘してくれたJohnnyHKに感謝します。実際の問題/解決策については、以下のコメントを参照してください。

fs.stat()関数呼び出しは非同期であるため、filestatus配列の操作は重複しています。elmigrantoが提案したように非同期ライブラリを使用するか、fs.statSyncの使用に切り替える必要があります。

何が起こっているかの詳細:

fs.stat()を呼び出すと、基本的にバックグラウンドで実行され、すぐに次のコード行に進みます。ファイルの詳細を取得すると、コールバック関数を呼び出します。この関数は、コード内で、ファイルステータス配列に情報を追加する関数です。

fs.stat()は戻る前に待機しないため、プログラムはデータ配列を非常に高速に処理し、複数のコールバックが同時に実行され、z変数がすぐにインクリメントされないため、問題が発生します。

filestatus[z]=stats.isDirectory()

zがインクリメントされる前に、異なるコールバックによって複数回実行される可能性があります。

それが理にかなっていることを願っています!

于 2013-01-15T12:37:56.680 に答える