Wie, um sicherzustellen, dass alle Daten physisch auf die Festplatte geschrieben?
Verstehe ich .NET FileStream-Flush-Methode schreibt nur den aktuellen Puffer auf Festplatte, aber abhängig von Windows' disk-Treiber und die Festplatte-firmware ist dies keine Garantie, dass die Daten tatsächlich physisch auf den Datenträger geschrieben.
Gibt es eine .NET-oder Win32-Methode, kann mir diese Garantie? Also, wenn es Stromausfall eine Nanosekunde nach dem Aufruf dieser Methode kommt zurück, kann ich trotzdem sicher sein, dass alles OK ist?
InformationsquelleAutor der Frage Stefan Schultze | 2008-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suchen Sie unter Windows auf FlushFileBuffers (Win32-API).
InformationsquelleAutor der Antwort
Stefan S. sagte:
Nein, .NET FileStream Bündig schreibt nur die .NET-Puffer zu den OS-cache, es ist nicht bündig, der OS-cache auf der Festplatte. Leider ist die MSDN-doc auf dieser Klasse nicht sagen. Für .NET < 4.0 haben, müssen Sie rufen Flush + Win32 - FlushFilebuffers:
Für .NET 4.0, Sie können stattdessen den neuen flush(true) - Methode.
Am 11.09.2012 update: MS bug-report hier sagt, dass es kaputt ist, dann fixiert, kann aber nicht sagen, welche version oder service pack, das es gefixt wurde! Klingt wie bug war, wenn interne .NET FileStream-Puffer leer ist, die Flush(true) hat nichts getan??
InformationsquelleAutor der Antwort jimvfr
Ich habe bemerkt, dass die .NET 4 #Flush(true) nicht wirklich auf die Festplatte schreiben. Wir waren mit seltsamen Probleme mit beschädigten Daten, und ich fand diese Fehlerbericht auf der MS Website:
Die Registerkarte "details" für den bug-report hat ein test-Programm, das Sie ausführen können, zeigen das Problem;
fs.Flush(true)
. Das braucht keine Zeit (viel schneller, als man vielleicht auf die Festplatte geschrieben).FlushFileBuffers
. Dies dauert eine lange Zeit.Ich ändern bin über die win32-FlushFileBuffers aufrufen...
InformationsquelleAutor der Antwort dave
Gut, man könnte die Datei schließen... das würde es vermutlich tun. In der Realität, mit HAL Abstraktion, Virtualisierung, disk-hardware jetzt mit mehr Rechenleistung und cache-Speicher als Computer habe vor ein paar Jahren, wirst du Leben müssen, mit der Hoffnung das die Festplatte macht seinen job.
Transactional file system nie wirklich materialisiert ;-p man könnte natürlich vielleicht mit einer Datenbank als Backend, und verwenden Sie die Transaktion system?
Beiseite: beachten Sie, dass nicht alle streams auch garantieren zu
Flush()
- zum BeispielGZipStream
etc behalten, dass ein arbeiten Puffer nicht gespeicherte Daten auch nach einem flush - der einzige Weg, um es zu Spülen alles istClose()
.InformationsquelleAutor der Antwort Marc Gravell
Die Datei Daten, die im Zwischenspeicher gespeichert in der Datei system cache auf die Festplatte geschrieben werden. Dass Daten, die normalerweise träge geschrieben, basierend auf der position des disk-schreib-Kopf. Mit einem gigabyte Cache Daten technisch möglich ist, so kann es durchaus eine Weile dauern. Wenn dies für Sie wichtig ist, dann erwägen, die
FileOptions.WriteThrough
option statt.InformationsquelleAutor der Antwort MSH
Es gibt einfach zu viele Abstraktionsebenen, um absolut sicher zu sein, dass die Daten auf die Disk geschrieben wird, bis hinunter zur hardware-Ebene.
Nicht Brillant performant oder narrensicher, aber, wie über das wieder-öffnen der Datei, sobald es geschrieben ist, in einem separaten Prozess und die überprüfung der Größe oder Inhalt?
InformationsquelleAutor der Antwort Ayresome