2017-05-02 11 views
3

NodeJSを使用してディレクトリにあるすべてのファイルを連結する方法がより簡単か、より簡潔ですか?NodeJSは、ディレクトリ内のすべてのファイルを連結します。

は、bashのでは私はこのような何かができる:

var fs = require('fs'); 
var Promise = require('bluebird'); 

module.exports = function(directory, destination) { 
    return new Promise((resolve, reject) => { 
     fs.readdir(directory, (err, files) => { 
      if (err) { 
       return reject(err); 
      } 

      (function next() { 
       var file = files.shift(); 
       if (!file) { 
        return resolve(); 
       } 

       fs.readFile(directory + '/' + file, (err, content) => { 
        if (err) { 
         return reject(err); 
        } 

        fs.appendFile(destination, '\n' + content, (err) => { 
         if (err) { 
          return reject(err); 
         } 

         return next(); 
        }); 
       }); 
      })(); 
     }); 
    }); 
}; 
+0

コードの行や実行時に効率的であると聞かれますか? – Jokester

+2

* parallel *で 'promises'を実行することを考えましたか? –

+0

@PratikGaikwadはこの提案に感謝します。うん、私はそれを行います:)ちょうどこれのようなループするよりもいくつかのより良い方法があるのだろうかと思う。 –

答えて

2

あなたは簡単に並行して、ファイルを読み込んで参加することができasyncライブラリを使用する:

ここ
for file in $1 
do 
    cat "$file" 
    echo 
done > $2; 

は私が今やっていることです結果。

const fs = require("fs"); 
const async = require("async"); 
const path = require("path"); 

module.exports = function(directory, destination) { 

    return new Promise((resolve, reject) => { 

    fs.readdir(directory, (err, files) => { 
     if (err) 
      return reject(err); 

     files = files.map(file => path.join(directory,file)); 

     //Read all files in parallel 
     async.map(files, fs.readFile, (err, results) => { 
      if (err) 
       return reject(err); 

      //results[0] contents of file #1 
      //results[1] contents of file #2 
      //results[n] ... 

      //Write the joined results to destination 
      fs.writeFile(destination, results.join("\n"), (err) => { 
       if (err) 
        return reject(err); 

       resolve(); 
      }); 
     }); 

    }); 
    }); 
} 
2

あなたはpromisificationの利益を得るよりもbluebirdを使用するつもりなら。 promisifyAll()を使用して、fsモジュール内のすべてのエラーの最初のコールバック受け入れ非同期関数を変換して約束を返すことができます。あなたは上記の約束のリンクを読むことができます。

以下のコードは、すべてのファイルを文字列として読み込み、すべての内容を1つの文字列に変換し、その文字列をdestinationに書き込みます。

ここで返されたエラーは、おそらくcatch()ではありません。むしろ、呼び出し側は、返されたエラーを必要に応じて処理するためにcatch()を添付する必要があります。

const Promise = require('bluebird') 
const fs = Promise.promisifyAll(require('fs')) 
const path = require('path') 

module.exports = (directory, destination) => { 
    return fs.readdirAsync(directory) 
    .map(file => fs.readFileAsync(path.join(directory, file), 'utf8')) 
    .then(contents => fs.writeFileAsync(destination, contents.join('\n'))) 
} 
関連する問題