2009-04-24 5 views
16

TFileStreamはバッファリングされた出力を提供しますが、これは大部分の場合には優れていますが、(特にデバッグ中に)バッファをただちにフラッシュするのが得策です。私はフリーを呼び出すこと以外はそれをする方法は知らないが、それはある種の逆効果的なものである。TFileStreamをフラッシュする方法は?

良い方法がありますか?

答えて

25

ストリームをフラッシュする必要があります。試してください:

FlushFileBuffers(fs.Handle); 

?あなたはこれを見ましたか試しましたか?

6

私はaltCognitoの答え(FlushFileBuffers)はおそらく最高ですが、TFileStream自体がバッファリングをしないためだと思います。他のバッファリングされたストリームでは、ストリームがFlushメソッドを提供するかどうかを最初に調べる必要があります。そして、最後の手段として、シーク(始まり)とシーク(終点)の古い技を使うことができます。

6

これはちょっと複雑ですが、実際には(Win32 API)CreateFileの呼び出しで多くの動作を制御できます。 FILE_FLAG_WRITE_THROUGH/FILE_FLAG_NO_BUFFERINGを追加したり、FILE_FLAG_SEQUENTIAL_SCANまたはFILE_FLAG_RANDOM_ACCESSというキャッシュシステムに最適化のヒントを提供することもできます。そのようにTFileStreamを使用するには、Createをオーバーライドしてファイルハンドルの取得方法を変更する必要があると思います。 FWIW、FlushFileBuffersは、ファイルのClose/Openと同等です。繰り返しフラッシュするとたくさんの作業をしていると、コードが大幅に遅くなります。

ドキュメントのビットhere

+5

実際、コンストラクタをオーバーライドする必要はありません。すでにファイルハンドルを受け付けるオーバーロードされたバージョンがあります。したがって、次のように処理する必要があります(エラー処理は削除されました)。 FS:= TFileStream.Create(CreateFile(PChar(FileName)、...、FILE_FLAG_WRITE_THROUGH、...)); それだけです。本当に簡単です。 – Alex

2

あなたはTWriter /踏む​​を使用してか、単にTFileStreamインターフェイスに直進していますか? TReaderとTWriterには内部バッファがあります。しかし、通常のファイルストリームの場合、上記の回答ではそれがソートされています。私は個人的に直接それに対処する方法で自分のストリームを実装するだろう。

関連する問題