2011-02-07 19 views
20

MSDNは、FileStream.Flush(True) "はすべての中間ファイルバッファもクリアしていると言います。"FileStream.Flush()とFileStream.Flush(True)の違いは何ですか?

"すべての中間ファイルバッファ"は正確に何を意味しますか?

+1

メモMSバグレポートごとにフラッシュ(真)が壊れています。http://connect.microsoft.com/VisualStudio/feedback/details/634385/filestream-flush-flushtodisk-true-call-does-not-flush -the-buffers-to-disk#の詳細。 MSはそれを修正しましたが、修正された.NETバージョンは何も言いません。 – jimvfr

+0

このバグはどのバージョンの.NETで修正されましたか? – BaltoStar

答えて

23

ファイルシステムのキャッシュにバッファリングされたファイルデータがディスクに書き込まれます。そのデータは通常、ディスク書き込みヘッドの位置に基づいて遅延書き込みされます。ギガバイトのキャッシュされたデータを持つことは技術的に可能ですので、かなりの時間がかかります。これが重要な場合は、代わりにFileOptions.WriteThroughオプションを検討してください。書き込みキャッシュを完全に無効にします。これは非常に高価な場合があります。ハードディスクが本当にどれほど遅いかを知ることができます。

0

これは、ファイルにバッファをフラッシュするために余分な呼び出しを行います。

Win32Native.FlushFileBuffers(this._handle); 
+2

MS実装のソースコードを投稿してもよろしいですか? (私がここのコード全体が答えに価値を追加しないと思うにもかかわらず) –

+1

リバースエンジニアを使用してリフレクタを使用しました。 Theerはそのことで違法ではありません。 – Aliostad

+1

ソースコードの投稿 - これはMetaで多く議論されています。たとえば、http://meta.stackexchange.com/questions/74890/is-it-inappropriate-to-post-decompiled-code-from-the-net-bclおよびhttp://meta.stackexchange.com/questions/ 20153/posting-code-from-reflector – bic

4

ファイルにFlush()またはFlush(false)FileStream」コピーを呼び出すと、任意のデータは、以前にバッファに書き込まれ、バッファをクリアします(を除きますそのエンコーダ状態のために)」。ここでいうバッファとは、内部バッファがFileStreamのクラスを意味します。ファイルへのコピーはディスクへのデータの書き込みではありません。それはOSにデータを渡すだけです。

しかし、Windows OSのIO操作もバッファリングされます。データをディスクに書き込むことは、システムが実行する準備が整うまで延期することができます。したがって、すべての中間バッファをクリアすると、バッファされたデータがディスクに書き込まれます。バッファとは、Windowsの内部バッファ[ファイルシステムキャッシュ]を意味します。

ファイルを閉じると、すべてのバッファリングされたデータが自動的にディスクに書き込まれます。したがって、ファイルハンドルが閉じられる前にデータをフラッシュする必要がある場合にのみ、このファイルが必要です。

+0

"FileStream"には "エンコーダの状態"がありません。文字ではなくバイトをとり、ディスクから/に転送します。おそらく 'StreamWriter'を考えていたでしょうか? –

関連する問題