2017-02-16 2 views
3

私はappendFileメソッドを使用してコンテンツをファイルに追加しています。以下は、そのコードの簡略化されたバージョンです。問題を説明するだけで十分です。 私の問題は、プロセスが終了すると、ファイルの内容がappendFileによって最後に書き込まれたデータより遅れてしまうことです。つまり、追加するためにfs.appendFileに渡されるすべてのデータはディスクに書き込まれません。この制限を回避するには?私はFSの方法のいずれかの同期バージョンを使用しないことを好むだろうNode.jsのfs.appendFileメソッドをディスクにすぐにフラッシュする方法はありますか?

fs = require('fs'); 
    myVal  = 1; 

    setInterval (function() { 
    ++myVal; 
    fs.appendFile("/tmp/test.d", myVal +":",'utf8', function(err) { 
     console.log(myVal); 
    }); 
    }, 10000); 

+1

'++ myVal'を' fs.appendFile'の前に置くと、コンソールログとファイルに同じことが表示されます。 –

+0

@FaridNouriNeshat、あなたはそれについて正しいです。私の問題の単純化は悪く、私はそれを編集しています。しかし、私は、ディスク上のデータを追記と同期させて保つことができないという点があります。ディスクへの書き込みを常にフラッシュするfs.appendFileを取得するには、どこかにありますか? – Sam

答えて

2

あなたが呼び出し自体でこれを行うことはできませんが、確かに以前の書き込みをフラッシュするfs.fdatasync()を呼び出すことができますディスクに保存します。作業が完了したときに必ずファイルを閉じてください

// Open the file 
fs.open(filename, "a+",(err, fd) => { 
    // Write our data 
    fs.writeFile(fd, data, (err) => { 
     // Force the file to be flushed 
     fs.fdatasync(fd /*, optional callback here */); 
    }); 
}); 

:そうするために、あなたは三の段階になってしまいますので、以前に開いたファイル記述子ではなく、文字列のファイル名を使用するようにappendFile呼び出しを変更する必要がありますそれと。個人的には、私はこの目的のために正確にappendFileSyncというような簡単で明白なオプションが存在する場合に、このアプローチの価値について質問します。実際に値を追加することなく、プログラムを理解しにくくします。

しかし、それは動作します。

+0

これは確かに有用であり、私は試してみます。しかし、appendFileSyncを使用するオプションは、私のコードがサーバ上にあり、この呼び出しがappend中にサーバ全体をブロックし、これらのappendが頻繁に複数のファイルにあるためです。 – Sam

+1

ポイントは、 'fdatasync'は同じことをします。サーバーにファイルのデータをフラッシュするように強制すると、その1つのことを行う必要があります。プロセスをブロックします。これは単に(通常はLinuxの) 'fdatasync(2)'システムコールのラッパーであり、そのドキュメントは "デバイスが転送が完了したことをデバイスが報告するまで呼び出しがブロックされます"と明示的に言います。 @Chat Robinson。 –

+0

今私には意味がある。私はあなたの答えに入力ミスがあると思います... fs.appendFileはfs.writeでなければなりませんか?それを訂正することができれば、私はあなたの答えを受け入れます。 – Sam

関連する問題