2016-06-17 24 views
1

いくつかのファイルを読み込み、その名前をnodejsの配列に格納しようとしています。私は機能を作った。ファイルを読み込んでコンソールに出力しますが、配列の出力は[]です。私はnode.jsが非同期だと仮定していますが、コールバックがそれを修正すると思いましたか?ファイルを非同期で読み取る

readCurdir("./uploads/", curDirReadFinn); 
function readCurdir(dir, callback){ 
    var tmpArray = []; 
    fs.readdir(dir, function(err, files){ 
    if(err){ 
     if(err.code==='EISDIR'){} 
     else{ 
     console.log(err); 
     } 
     return; 
    } 
    files.forEach(function(file){ 
     fs.readFile(dir + file, 'utf-8', function(err, data){ 
     if(err){ 
      if(err.code==='EISDIR'){} 
      else{ 
      console.log(err); 
      } 
      return; 
     } 
     tmpArray.push(file); 
     console.log(file); //this prints 
     }); 
    }); 
    }); 
    callback(tmpArray); 
} 
function curDirReadFinn(array){ 
    console.log(array); //Output: [] 
} 

また、私はこれを試してみました:

files.forEach(function(file){ 
    fs.readFile(dir + file, 'utf-8', function(err, data){ 
    if(err){ 
     if(err.code==='EISDIR'){} 
     else{ 
     console.log(err); 
     } 
     return; 
    } 
    tmpArray.push(file); 
    counter++; 
    if(counter === files.lenght){ 
    callback(tmpArray); 
    } 
    }); 
}); 
+0

あなたはおそらく 'tmpArrayを行う必要があります.push(data); '今はファイル参照を保存しています。 – Quirk

+0

はい私はファイル名を格納しています、それがポイントです。理由は、私はファイルを(fs.readFile)を読んでいるので、私は、フォルダをフィルタリングしたいです。 – OlaStein

+1

すべてのファイルを読み込むのはちょっと残念ですが、[stat](https://nodejs.org/api/fs.html#fs_fs_stat_path_callback)と[checkher wetFile()](https:// nodejs .org/api/fs.html#fs_class_fs_stats)、ファイルシステムからすべてのデータを読み取ることはありません – Thomas

答えて

2

2度目の試行で正しいアイデアが得られました。 私はそれを簡素化のだ後、それはその後、完璧に動作します:

function readCurdir(dir, callback){ 
    var tmpArray = []; 

    fs.readdir(dir, function(err, files) { 
    if (err) { 
     return console.log(err); 
    } 

    var counter = files.length; 

    files.forEach(function(file) { 
     fs.stat(path.join(dir, file), function(err, stats) { 
     if (err) { 
      console.log(err); 
     } 
     else if (stats.isFile()) { 
      tmpArray.push(file); 
     } 

     --counter === 0 && callback(tmpArray); 
     }); 
    }); 
    }); 
} 

あなたも、それをさらに簡素化(およびより簡単にエラーを伝播する)ことができasyncモジュールを使用して:

async.each(files, function(file, cb) { 
    fs.stat(path.join(dir, file), function(err, stats) { 
    if (err) { 
     return cb(err); 
    } 
    else if (stats.isFile()) { 
     tmpArray.push(file); 
    } 

    cb(); 
    }); 
}, function(err) { 
    callback(err, tmpArray) 
}); 
+0

はい、これは機能します!ありがとうございました! – OlaStein

1

非同期コードのストライキを再び! fs.readdir()は非同期です。 callbackメソッドはfs.readdir()の実行とは別に呼び出されます。そのため、tmpArrayは、コールバックメソッドcurDirReadFinn()にログインすると空になります。同期

  1. 準備ディレクトリとファイル:

    はあなたの問題を解決するには、いくつかの方法があります。 NodeJSにはそのためのメソッドがあります。ここをクリックしてください:https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options

  2. @Thomasと同様に、statisFile()を使用すると、より高速に処理できます。一般的には、大量の非同期コードが不要です。

  3. 使用約束!

+0

イエップは、約束を使用して始めた。ありがとう! – OlaStein

関連する問題