Thread Sicheres Löschen (25 answers)
Opened by bianca at 2013-04-07 09:48

thomas38
 2013-04-24 00:56
#167216 #167216
User since
2012-11-04
30 Artikel
BenutzerIn
[default_avatar]
2013-04-07T13:16:36 bianca
Danke für alle Antworten.
Zum Hintergrund: Das Dateihandling ist gekapselt in einer sub. Diese sub macht in dieser Reihenfolge folgendes:
1. sysopen
2. flock
3. binmode
4. seek
5. readline
6. truncate
7. print
8. close
9. unlink if -z

Und genau damit ist mir letztens eine Datei verloren gegangen. War nur ein unwichtiger Chat aber schon bei zwei Leuten hat das unlink offensichtlich einmal mitten rein gegrätscht, denn plötzlich war der Chat leer :(

Mal davon abgesehen, dass man das mit einer DB sicher einfacher hinbekommt und auch die Frage berechtigt ist, warum ich leere Dateien nicht haben will, möchte ich trotzdem gern das Problem lösen.
Daher mal ganz allgemein, wie würdet ihr das machen?
Weitere Prämisse: Es bestehen keine Admin-Rechte!
Danke für alle Tipps.



Du öffnest die Datei (Schritt 1) und versuchst anschließend ein flock (Schritt 2). Somit ist sie bereits geöffnet.

Meine Empfehlung:
Eine eigene Lock-Datei beim Start des Programms anlegen, sofern sie noch nicht existiert (als _ein_ Systemaufruf). Es ist kein Fehler, wenn die Datei bereits existiert.

Anschließend diese Datei (Inhalt egal) in Deiner sub als Lockdatei verwenden, _bevor_ mit sysopen die Datendatei geöffnet wird.
Wenn alle Operationen mit der Datendatei beendet sind, kann der Lock auf die Lockdatei wieder freigegeben werden. Die Lockdatei darf natürlich nicht gelöscht werden.
Das Löschen der Lockdatei kann beim Programmende durchgeführt werden.

Allerdings können so andere Prozesse die Datei natürlich öffnen, die mit Deinem Programm nichts zu tun haben. Unter Windows hast Du dann das Pech, dass diese Datei trotzdem nicht gelöscht werden kann, obwohl _Dein_ Programm die Datendatei nicht im Zugriff hat.

View full thread Sicheres Löschen