Стефан С. сказал:
Я понимаю, что метод Flush .NET FileStream записывает только текущий буфер на диск
Нет, .NET FileStream's Flush только записывает буферы .NET в кеш ОС, но не сбрасывает кеш ОС на диск. К сожалению, документ MSDN этого класса не говорит этого. Для .NET <4.0 вам нужно вызвать FlushFilebuffers Flush + Win32: </p>
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).
11/09/2012 обновление: отчет об ошибках MS здесь говорит, что он сломан, затем исправлен, но не говорит, в какой версии или в пакете обновления он был исправлен! Похоже, ошибка была, если внутренний буфер .NET FileStream пуст, Flush (true) ничего не сделал ??