TFileStreamはバッファリングされた出力を提供しますが、これは大部分の場合には優れていますが、(特にデバッグ中に)バッファをただちにフラッシュするのが得策です。私はフリーを呼び出すこと以外はそれをする方法は知らないが、それはある種の逆効果的なものである。TFileStreamをフラッシュする方法は?
良い方法がありますか?
TFileStreamはバッファリングされた出力を提供しますが、これは大部分の場合には優れていますが、(特にデバッグ中に)バッファをただちにフラッシュするのが得策です。私はフリーを呼び出すこと以外はそれをする方法は知らないが、それはある種の逆効果的なものである。TFileStreamをフラッシュする方法は?
良い方法がありますか?
ストリームをフラッシュする必要があります。試してください:
FlushFileBuffers(fs.Handle);
?あなたはこれを見ましたか試しましたか?
私はaltCognitoの答え(FlushFileBuffers)はおそらく最高ですが、TFileStream自体がバッファリングをしないためだと思います。他のバッファリングされたストリームでは、ストリームがFlushメソッドを提供するかどうかを最初に調べる必要があります。そして、最後の手段として、シーク(始まり)とシーク(終点)の古い技を使うことができます。
これはちょっと複雑ですが、実際には(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
あなたはTWriter /踏むを使用してか、単にTFileStreamインターフェイスに直進していますか? TReaderとTWriterには内部バッファがあります。しかし、通常のファイルストリームの場合、上記の回答ではそれがソートされています。私は個人的に直接それに対処する方法で自分のストリームを実装するだろう。
実際、コンストラクタをオーバーライドする必要はありません。すでにファイルハンドルを受け付けるオーバーロードされたバージョンがあります。したがって、次のように処理する必要があります(エラー処理は削除されました)。 FS:= TFileStream.Create(CreateFile(PChar(FileName)、...、FILE_FLAG_WRITE_THROUGH、...)); それだけです。本当に簡単です。 – Alex