Stefan S. sagte:
Ich verstehe, dass die Flush-Methode von .NET FileStream nur den aktuellen Puffer auf die Festplatte schreibt
Nein, .NET FileStream's Flush schreibt nur die .NET-Puffer in den OS-Cache, es flusht den OS-Cache nicht auf die Festplatte. Leider steht das nicht in der MSDN-Dokumentation zu dieser Klasse. Für .NET < 4.0, müssen Sie Flush + Win32's FlushFilebuffers aufrufen:
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);
}
Für .NET 4.0 können Sie stattdessen die neue Methode flush(true) verwenden. Update vom 11.09.2012: MS-Fehlerbericht aquí sagt, dass es kaputt ist, dann behoben, aber sagt nicht, in welcher Version oder welchem Service Pack es behoben wurde! Klingt, als ob der Fehler auftrat, wenn der interne .NET FileStream-Puffer leer ist und Flush(true) nichts bewirkt?