Problem beim Speichern von Dateien

18/05/2009 - 12:48 von Edzard Egberts | Report spam
Hallo,

ich habe hier einen Fehler beim Abspeichern von Dateien (unter Windows
XP) gefunden, bei dem mir absolut nicht klar ist, wie so etwas passieren
kann:
Abgespeichert wird ein STL-Container über eine for-Schleife, wobei der
Inhalt datensatzweise auf einen std::fstream geschrieben wird. Weil ich
mich schon seit Jahren damit herumàrgere, dass Windows beim Speichern
Daten verliert, werden von den Dateien stàndig Backups angelegt, die
auch mit einer Prüfsumme versehen sind. Ich habe also drei Versionen,
eine von 15:40 Uhr, die in Ordnung ist (CRC-Prüfsumme okay), eine von
15:47 Uhr, die ab 0x80000 nur noch mit Nullen beschrieben ist und eine
von 16:18, die nur noch Nullen enthàlt, alle drei Dateien haben aber die
gleiche Größe von 869 kB.

Für mich sieht das so aus, als wàre die Software störungsfrei weiter
gelaufen, nur das Speichern hat plötzlich nicht mehr funktioniert. Dass
der Container kaputt gegangen ist, kann ich eigentlich ausschließen,
weil in der dritten Datei noch nicht einmal die statischen
Header-Informationen vorhanden sind und alle Dateien die gleiche Größe
haben - die Daten sind scheinbar beim Schreiben "genullt" worden.
Außerdem wird nach dem Schreiben der Stream-Status geprüft und die
Software steigt mit einer Fehlermeldung aus, wenn beim Schreiben einer
Systemdatei ein Fehler erkannt wird (!good()), das ist aber nicht passiert.

Weil die Backups nur noch Nullen enthielten, war der Kunde genau eine
Sicherungsdatei vom totalen Datenverlust entfernt - so etwas macht mich
krank! Kann man sich denn wirklich gar nicht auf Windows verlassen, so
dass meine Software nach jedem Abspeichern noch einmal die gesamte Datei
zurücklesen und prüfen muss? Meiner Meinung nach darf so ein Fehler
keinesfalls auftreten, oder müsste zumindestens vom Betriebssystem
gemeldet werden. Ich verstehe auch gar nicht, wo genau so ein Fehler
auftreten kann - gepufferter Schreibzugriff, der erst nachtràglichen
schief geht, so dass die Software das nicht mehr bemerkt? Aber beim
close() erfolgt doch ein flush(), oder muss da etwas beachtet werden?

Auslösendes Moment für diesen Fehler waren möglicherweise
Stromschwankungen, weil der Regen eine Laterne unter Wasser gesetzt hat
und àhnliche Fehler kenne ich auch, wenn der PC plötzlich einen
Stromausfall hat. Aber in so einem Fall würde ich doch eigentlich eine
abgeschnittene Datei erwarten und nicht, dass der weiterarbeitet und
Müll abspeichert.

Irgendwelche Ideen, was da los war?

Ed
 

Lesen sie die antworten

#1 Thomas Koller
18/05/2009 - 13:37 | Warnen spam
Edzard Egberts wrote:
Weil die Backups nur noch Nullen enthielten, war der Kunde genau eine
Sicherungsdatei vom totalen Datenverlust entfernt - so etwas macht mich
krank! Kann man sich denn wirklich gar nicht auf Windows verlassen, so
dass meine Software nach jedem Abspeichern noch einmal die gesamte Datei
zurücklesen und prüfen muss? Meiner Meinung nach darf so ein Fehler
keinesfalls auftreten, oder müsste zumindestens vom Betriebssystem
gemeldet werden. Ich verstehe auch gar nicht, wo genau so ein Fehler
auftreten kann - gepufferter Schreibzugriff, der erst nachtràglichen
schief geht, so dass die Software das nicht mehr bemerkt? Aber beim
close() erfolgt doch ein flush(), oder muss da etwas beachtet werden?



Afaik wird bei einem flush nur der C-buffer geleert, aber nicht
unbedingt der cache vom BS auf die Platte geschrieben. Dazu müsstest
für die Platte den Schreibcache ausschalten, auch wenn das etwas
auf die Performance geht.

Tom

Ähnliche fragen