2013-07-15 7 views
15

私がしたいことは、ファイルを読み込んだ後、その情報を使ってファイルを書き込むときに他の操作を実行できることです。たとえば、次のようにNode.jsファイルを読み込み、2つの別々の関数で同じファイルを書き込む方法は?

読み取りファイル 書き込みファイルと同時に、MD5ハッシュを実行し、デジタル署名など

私は1つの操作としてfs.readfileとfs.writefile使用し、ちょうどウェブからファイルをコピーすることができサーバーをコンピュータに接続することはできますが、私はこれらの操作を引き続き行うことはできません。とにかく、その間をスキップします。 fs.readfileとwritefileを使用して、ファイルをコピーする2つの別々の関数を作成するにはどうすればよいですか?ここで私が取り組んできたのは、はい、私は答えを探して広範囲にこれらのフォーラムを読んできました。

var fs = require('fs'); 



function getData(srcPath) { 
fs.readFile(srcPath, 'utf8', function (err, data) { 
     if (err) throw err; 
     return data; 
     } 
    ); 
} 


function writeData(savPath, srcPath) { 
     fs.writeFile (savPath, (getData(srcPath)), function(err) { 
     if (err) throw err; 
      console.log('complete'); 
     } 
    ); 
} 
//getData ('./test/test.txt'); 
writeData ('./test/test1.txt','./test/test.txt'); 

任意のタイプのファイルをダウンロードして、md5ハッシュなどをJSONファイルに添付してrawコピーを作成したいと考えています。それはおそらく後での質問かもしれません。

+0

getDataはコード内で何も実行しません。 readFileのコールバックでwriteFileを呼び出す必要があります。あなたがgit-r-dunをしたいのであれば、常にfs.readFileSync()があります。これはおそらくあなたが期待するように機能します。 – dandavis

答えて

17

彼のコメントでdandavisが提案したように、readFileは非同期呼び出しなので何もしません。その意味の詳細については、this answerを参照してください。

つまり、非同期呼び出しは、結果が返るのを待つことはありません。あなたの例では、getDatareadFile()が望む結果を返すのを待っていませんが、すぐに終了します。非同期呼び出しは、通常、最後のパラメータであるcallbacksreadFilewriteFileに渡すことによって処理されます。非同期

それ1.Do(適切な方法である):いずれの場合で

、これには2つの方法があり、それ2.Do

function copyData(savPath, srcPath) { 
    fs.readFile(srcPath, 'utf8', function (err, data) { 
      if (err) throw err; 
      //Do your processing, MD5, send a satellite to the moon, etc. 
      fs.writeFile (savPath, data, function(err) { 
       if (err) throw err; 
       console.log('complete'); 
      }); 
     }); 
} 

同期。コードを大きく変更する必要はありません。readFilewriteFileをそれぞれreadFileSyncwriteFileSyncに置き換えるだけで済みます。 警告:この方法はベストプラクティスに反しているだけでなく、(まったく正当な理由がない限り)nodejsの目的を無視しています。

編集:、あなたがから(getFileContent中)の読み取り部分を分離している

function getFileContent(srcPath, callback) { 
    fs.readFile(srcPath, 'utf8', function (err, data) { 
     if (err) throw err; 
     callback(data); 
     } 
    ); 
} 

function copyFileContent(savPath, srcPath) { 
    getFileContent(srcPath, function(data) { 
     fs.writeFile (savPath, data, function(err) { 
      if (err) throw err; 
      console.log('complete'); 
     }); 
    }); 
} 

この方法:OPの要求を1として、ここでは二つの方法、例えば、使用してコールバックを分離するための1つの可能な方法でありますコピー部分。

+0

あなたの言っていることから、これを同期させるのは時間の浪費です。私はちょうどプログラムの中で1つだけを使用する必要がある場合に備えて、別の機能としてreadfileとwritefulを分ける方が簡単だと考えました。それでも、すべての処理を正しく行うことができれば、これはより効果的です。私はちょうどそれを試して、それが動作するかどうかを確認する必要があります。 –

+0

読み取りとコピーを分ける方法については、私の編集をチェックしてください。同じテクニックをwriteFileに適用できます(たとえば、コールバックを渡すなど)。 – verybadalloc

0

私はこれを最近使用しなければならなかったので、私はverybadallocsの答えを約束に変換しました。

function readFile(srcPath) { 
    return new Promise(function (resolve, reject) { 
     fs.readFile(srcPath, 'utf8', function (err, data) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(data); 
      } 
     }); 
    }) 
} 

function writeFile(savPath, data) { 
    return new Promise(function (resolve, reject) { 
     fs.writeFile(savPath, data, function (err) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(); 
      } 
     }); 
    }) 
} 

次に、それらを使用するのは簡単です。

readFile("path").then(function(results){ 
    results+=" test manipulation"; 
    return writeFile("path",results); 
}).then(function(){ 
    //done writing file, can do other things 
}) 
関連する問題