Problem mit ofstream zur Sicherung gegen Stromausfall
-
Hallo,
Ich sichere einige Daten in einer Datei.
Um sie gegen Stromausfall zu sichern kopiere ich die Datei nach dem schreiben.
Die Dateien werden regelmäßig neu geschrieben.
Eigentlich sollte so sichergestellt sein, dass falls während eines Dateizugriffs der Strom ausfällt, die zweite Datei als Ersatz dient.
Leider sind bei einem Stromausfall während des Schreibens beide Dateien kaputt. (stehen lauter Null-Bytes drin)
Es wird ein XML-Tag serialisiert.
Hier ein Codeausschnitt:if(XmlFile::Write(filepath, tag, &crypto)) { //bakupdatei anlegen string bakfilepath = filepath+".bak"; CopyFile(filepath.c_str(),bakfilepath.c_str(),false); return true; }bool XmlFile::Write(const string& fileName, const vector<XmlTag>& contents, XmlCrypto<char>* cryptoObject, const string xmlVersion, const string xmlEncoding) { ofstream file(fileName.c_str(), ios_base::binary); stringstream text; for_each(contents.begin(), contents.end(), WriteTag(text)); char ch = 0x0; while (text.get(ch)) { if (cryptoObject) ch = cryptoObject->Crypt(ch); file << ch; } file.flush(); file.close(); return true; }Kann mir jemand sagen woran es liegt, dass beide Dateien kaputt sind?
Habe auch schon versucht die datei zweimal zu schreiben anstatt zu kopieren aber es hilft nichts.
-
flush ist schon die richtige Wahl. Leider bedeuted nur, dass der Puffer geleert und dem Dateisystem zum schreiben ueberlassen wurde. Wenn das Betriebssystem/Dateisystem selbst noch puffert, gehen beim Stromausfall die Daten verloren.
Das Problem kann nur mit betriebsspezifischen Funktionen entschaerft werden.
-
Mach statt copy lieber rename. Das geht schneller. Da du die alte Datei eh danach überschreibst brauchst du ja keine Kopie.
-
Mist, stimmt.
Da muss ich mir mal was anderes überlegen
-
Stichwort
FlushFileBuffers.