Frage

Ich verstehe, dass .NET Filestream der Flush-Methode nur den aktuellen Puffer auf die Festplatte schreibt, aber abhängig von Windows-Festplattentreiber und die Firmware der Festplatte ist nicht gewährleistet, dass die Daten tatsächlich physisch auf die Festplatte geschrieben wird.

Gibt es eine .NET oder Win32-Methode, die mir diese Garantie geben kann? Also, wenn es Stromausfall eine Nanosekunde nach dem Aufruf dieser Methode ist, zurückkommt, kann ich immer noch sicher sein, dass alles in Ordnung ist?

War es hilfreich?

Lösung

Unter Windows sehen Flushfilebuffers (Win32 API).

Andere Tipps

Stefan S. sagte:

  

Ich verstehe, dass .NET Filestream der Flush-Methode nur den aktuellen Puffer auf die Festplatte schreibt

Nein, .NET Filestream des Flush nur schreibt die .NET-Puffer in die OS-Cache, ist es nicht die OS-Cache auf die Festplatte schreibt. Leider ist die MSDN doc auf dieser Klasse nicht sagen, dass. Für .NET <4.0, werden Sie Flush + Win32 der Flushfilebuffers aufrufen müssen:

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 flush (true) Methode verwenden. 11.09.2012 Update: MS Bug-Report hier sagt, es ist gebrochen, dann fixiert, aber nicht sagen, welche Version oder Service Pack es in fixiert war! Klingt wie war Fehler, wenn internen .NET Filestream-Puffer leer ist, das Flush (true) tat nichts ??

Nun, könnten Sie die Datei schließen ... dass es wahrscheinlich tun würde. In Wirklichkeit mit HAL Abstraktion, Virtualisierung und Disk-Hardware jetzt mehr Rechenleistung und Cache-Speicher als Computer hat vor ein paar Jahren, Sie gehen mit der Hoffnung, die Scheibe macht seinen Job zu haben, zu leben .

Das Transaktionsdateisystem materialisierte nie wirklich ;-p Natürlich können Sie vielleicht bei Verwendung einer Datenbank als Backend aussehen könnten, und das Transaktionssystem, dass verwenden?

Neben: beachten Sie, dass nicht alle Streams selbst zu Flush() garantieren - zum Beispiel, GZipStream etc einen Arbeitspuffer von unbestätigten Daten behalten auch nach einem Flush - der einzige Weg, um es zu bekommen zu spülen alles ist Close() es.

Ich habe bemerkt, dass die .NET 4 #FLUSH (true) schreibt nicht tatsächlich auf die Platte. Wir hatten seltsame Probleme mit beschädigten Daten und ich fand diese Fehlerbericht auf der MS-Website:

Die Registerkarte Details für den Fehlerbericht hat ein Testprogramm, dass ausführen kann, wird das Problem zeigen;

  1. Schreiben Sie eine Reihe von Daten auf der Festplatte
  2. fs.Flush(true). Dies dauert keine Zeit (viel schneller, als es auf die Platte möglicherweise geschrieben).
  3. Verwenden Sie die Win32-API FlushFileBuffers. Dies dauert eine lange Zeit.

Ich bin die Umstellung auf den win32 Flushfilebuffers nennen ...

Die Dateidaten, die in dem Dateisystem-Cache gepuffert ist, um auf die Festplatte geschrieben werden. Diese Daten werden normalerweise träge geschrieben, basierend auf der Position des Plattenlesekopfes. ein Gigabyte Cache gespeicherten Daten zu haben, ist technisch möglich, so dass es eine ganze Weile dauern kann. Wenn dies für Sie wichtig ist, dann sollten Sie die Option FileOptions.WriteThrough statt.

  

Es gibt eine einfache Antwort den Inhalt des Puffers auf Platte zu spülen.   Nach Ihrer WriteAllText Funktion geöffneten Datei, schließen Sie es und setzen Sie es

     

Hier ist ein Beispiel

My.Computer.FileSystem.WriteAllText(yourfilename, "hello", False, System.Text.Encoding.ASCII)
FileOpen(1, yourfilename, OpenMode.Input)
FileClose(1)
Reset()

Es gibt einfach zu viele Abstraktionsebene absolut sicher zu sein, dass die Daten auf die Platte geschrieben werden, bis auf Hardware-Ebene.

Nicht brillant performant oder narrensicher, aber wie wäre es erneutes Öffnen der Datei, nachdem sie in einem separaten Prozess und die Überprüfung der Größe oder Inhalt geschrieben?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top