23

.NET FileStream の Flush メソッドは現在のバッファーのみをディスクに書き込むことを理解していますが、Windows のディスク ドライバーとハード ディスク ファームウェアによっては、データが実際に物理的にディスクに書き込まれるという保証はありません。

この保証を提供できる .NET または Win32 メソッドはありますか? したがって、このメソッドの呼び出しが戻ってから 1 ナノ秒後に電力損失が発生した場合でも、すべてが正常であると確信できますか?

4

7 に答える 7

17

ステファン S. は次のように述べています。

.NET FileStream の Flush メソッドは、現在のバッファーをディスクに書き込むだけであることを理解しています

いいえ、.NET FileStream の Flush は .NET バッファを OS キャッシュに書き込むだけで、OS キャッシュをディスクにフラッシュしません。残念ながら、このクラスに関する MSDN のドキュメントには、そのような記述はありません。.NET < 4.0 の場合、Flush + Win32 の FlushFilebuffers を呼び出す必要があります。

using System.Runtime.InteropServices;
. . .

// start of class:
[DllImport("kernel32", SetLastError=true)]
private static extern bool FlushFileBuffers(IntPtr handle);
. . .

stream.Flush();     // Flush .NET buffers to OS file cache.
#pragma warning disable 618,612 // disable stream.Handle deprecation warning.
if (!FlushFileBuffers(stream.Handle))   // Flush OS file cache to disk.
#pragma warning restore 618,612
{
  Int32 err = Marshal.GetLastWin32Error();
  throw new Win32Exception(err, "Win32 FlushFileBuffers returned error for " + stream.Name);
}

.NET 4.0 では、代わりに新しい flush(true) メソッドを使用できます。2012 年 11 月 9 日更新:ここのMS バグ レポートには、壊れてから修正されたと書かれていますが、どのバージョンまたはサービス パックで修正されたかは記載されていません。内部の .NET FileStream バッファが空の場合、バグのように聞こえますが、Flush(true) は何もしませんでした??

于 2010-10-21T22:14:20.080 に答える
9

Windows では、FlushFileBuffers (Win32 API) を見てください。

于 2008-12-20T13:36:34.697 に答える
4

まあ、ファイルを閉じることができます...それはおそらくそれを行うでしょう. 実際には、HAL の抽象化、仮想化、およびディスク ハードウェアの処理能力とキャッシュ メモリは、数年前のコンピューターよりも優れているため、ディスクが機能することを期待しながら生活する必要があります。

トランザクション ファイル システムは実際には実現しませんでした ;-p もちろん、データベースをバック エンドとして使用することを考えて、そのトランザクション システムを使用することはできますか?

余談ですが、すべてのストリームが保証されるわけではないことに注意してください。Flush()たとえば、 etc は、フラッシュ後もコミットされていないデータの作業バッファーを保持します。すべてGZipStreamをフラッシュする唯一の方法は、それを使用することです。Close()

于 2008-12-20T13:33:50.770 に答える
3

.NET 4 #Flush(true) が実際にはディスクに書き込まないことに気付きました。データが破損するという奇妙な問題があり、MS サイトで次のバグ レポートを見つけました。

バグ レポートの詳細タブには、問題を表示する実行可能なテスト プログラムがあります。

  1. 大量のデータをディスクに書き込む
  2. fs.Flush(true). これには時間がかかりません (ディスクに書き込むよりもはるかに高速です)。
  3. win32 API を使用しますFlushFileBuffers。これには長い時間がかかります。

私は win32 FlushFileBuffers 呼び出しに切り替えています...

于 2012-05-18T23:01:40.947 に答える
0

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

于 2016-09-21T14:23:57.153 に答える
-3

ハードウェア レベルに至るまで、データがディスクに確実に書き込まれるには、抽象化のレベルが多すぎます。

素晴らしいパフォーマンスや万能ではありませんが、別のプロセスで書き込まれたファイルを再度開いて、サイズや内容を確認してみてはどうでしょうか?

于 2008-12-20T19:05:10.603 に答える