TFileStreamはバッファリングされた出力を提供します。これはほとんどの場合に最適ですが、場合によっては(特にデバッグ中)、バッファをすぐにフラッシュすると便利です。物事は、私はそれを行う方法を知りませんが、Freeを呼び出すことは一種の逆効果です。
それを行うためのより良い方法はありますか?
TFileStreamはバッファリングされた出力を提供します。これはほとんどの場合に最適ですが、場合によっては(特にデバッグ中)、バッファをすぐにフラッシュすると便利です。物事は、私はそれを行う方法を知りませんが、Freeを呼び出すことは一種の逆効果です。
それを行うためのより良い方法はありますか?
ストリームをフラッシュする必要があります。試す:
FlushFileBuffers(fs.Handle);
?これを見ましたか/試しましたか?
altCognitoの答え(FlushFileBuffers)がおそらく最良だと思いますが、それはTFileStreamがそれ自体でバッファリングを行わないためです。その他のバッファリングされたストリームの場合、ストリームがFlushメソッドを提供しているかどうかを最初に確認する必要があります。そして最後の手段として、Seek(Begin)、次にSeek(CurrentPos)の古いトリックを使用することができます。
少し複雑ですが、実際には(win32 api)CreateFileの呼び出しでその動作の多くを制御できます。またはを使用して、キャッシュシステムに最適化のヒントを追加FILE_FLAG_WRITE_THROUGH
/FILE_FLAG_NO_BUFFERING
または提供することもできます。TFileStreamをそのように使用するには、Createをオーバーライドして、ファイルハンドルの取得方法を変更する必要があると思います。FWIW、FlushFileBuffersは、ファイルのClose/Openと同等です。フラッシュを繰り返して多くのアクティビティを実行している場合は、コードの速度が大幅に低下します。FILE_FLAG_SEQUENTIAL_SCAN
FILE_FLAG_RANDOM_ACCESS
ここに少しのドキュメント
TWriter / TReaderを使用していますか、それともTFileStreamインターフェイスをそのまま使用していますか?TReaderとTWriterには内部バッファがあります。ただし、通常のファイルストリームの場合、上記の応答では並べ替えられます。私は個人的に、それを直接処理するメソッドを使用して独自のストリームを実装します。