staging.inyokaproject.org

Wie sollte ein Programm auf Schreibfehler reagieren?

Status: Gelöst | Ubuntu-Version: Xubuntu 14.04 (Trusty Tahr)
Antworten |

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Vorweg, seit ich nicht mehr mit Disketten arbeite, kann ich mich nicht mehr an Schreibfehler erinnern. Aber das bedeutet ja nicht, das dies doch mal passieren kann.

Situation: Mein Programm ließt Datensätze aus einer Datei. Veränderungen an den Datensätzen werden erstmal nur im Speicher festgehalten, d.h. es befindet sich normalerweise nicht die gesamte Datei im Speicher. Wenn der Benutzer jetzt auf "Abspeichern" drückt, kann es zu diversen Fehlern kommen. Blöd.

Das Programm schreibt erstmal eine temporäre Datei, die bei Erfolg umbenannt wird (wobei die bisherige Datei in .bak umbenannt wird und die bisherige .bak gelöscht wird).

Frage: Wenn erst beim Schreiben ein Fehler auf tritt, muss ich da mit der .tmp Datei irgend etwas machen? Oder kann ich davon aus gehen, dass die einfach weg ist?

Letztendlich möchte ich ja dem Anwender die Möglichkeit eines neuen Versuchs geben. Also indem er etwa unter "Save As" ein anderes Medium (USB-Stick) auswählt, was dann aber wieder eine neue .tmp Datei erfordert.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dakuan schrieb:

Frage: Wenn erst beim Schreiben ein Fehler auf tritt, muss ich da mit der .tmp Datei irgend etwas machen? Oder kann ich davon aus gehen, dass die einfach weg ist?

Normalerweise nicht. Wenn z.B. der Datenträger einfach voll ist, dann bleibt die Datei da, aber mit weniger Inhalt als gewünscht. Du solltest die temporäre Datei auf jeden Fall explizit löschen, falls beim Schreiben ein Fehler auftritt und sie noch da ist.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Ich meine mich zu erinnern, das meine kleinen C Progrämmchen nach einem Absturz leere oder oft auch gar keine Dateien hinterlassen hatten. Ich hatte mir das dann mit dem fehlenden fclose() erklärt.

Wenn man davon ausgeht, das open() geklappt hat, sollte ich dann wohl nach einem Fehler folgendes machen:

  nbxfile.clear(...);
  nbxfile.close(...);
  remove(...);

Testen kann ich das bei meinen geringen Datenmengen aber schlecht.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Die Datei ist da, sobald Du sie mit den richtigen Optionen zum Schreiben geöffnet hast. Wie viel Inhalt drin landet, ist deutlich schwerer zu sagen, da das von Timing und Pufferung abhängt. Wegräumen ist bei einem Fehler auf jeden Fall eine gute Idee.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Dann werde ich mich mal daran machen, eine ordentliche Müllentsorgung einzurichten.

Das ist bei 3 Jahre altem Code allerdings nicht immer einfach. An manchen Stellen frage ich mich, wer da so umständlich programmiert hat. Da muss wohl einiges neu gemacht werden.

Antworten |