Tom: Dateien richtig öffnen und sperren

Beitrag lesen

Hello,

Eigentlich hatte ich das alles schon erklärt ...

ich öffne eine Text-Datei mit

file(test.txt);
fopen("test.txt",w);

Das ist gar nicht möglich.

möglich, aber unsinnig wäre:

$_file = file('test.txt');
  $fh = fopen('test.txt','w');     ## das leert die Datei

Zwischen den beiden Statements entsteht ein Kontrollbruch.
Es wird bei gut benutzten Systemen mit hoher Wahrscheinlichkeit ein anderer Prozess dazwischenfunken.

und sperre die datei dann sofort,

Das ist zu spät!

ändere den inhalt etwas ab und speichere ihn wieder.

Den Inhalt einer leeren Datei abzuändern ist schon sinnvoll *grins*

sollte nun mal das speichern nicht funktionieren, wäre meine datei ja gelöscht (fopen mit w = 0bytes).

Die muss jeden Fall als inkonsistent gelten!

was kann ich tun um sicherzustellen, dass der inhalt nie verloren geht?

Gar nicht.
Atombomben sind stärker als Festplatten

$fh = fopen($dateiname, 'a')     ## Datei zum Anhängen öffen oder anlegen
  if ($fh) fclose($fh);
  $fh = fopen($dateiname, 'r+');   ## vorhandene Datei zum Lesen und Schreiben öffnen
  $lock_ok = flock($fh, LOCK_EX);  ## Datei zum Zwecke des Lesens _und_ Schreibens sperren
                                   ## PHP wartet solange, bis es geklappt hat
  $file = fread($fh, filesize($dateiname)); ## Daten lesen

# hier jetzt die Manipulationen vornehmen am Buffer, also $file

fseek($fh, 0, SEEK_SET);         ## Dateizeiger zurück auf Anfang
  fwrite($fh, $file);              ## Veränderten Buffer zurückschreiben
  ftruncate($fh, strlen($file));   ## Dateilänge auf Bufferlänge kürzen
  fclose();                        ## Datei schließen und wieder freigeben

Es gibt mit advisory Locking keinen anderen Weg, der sicher funktioniert!

Diverse Spielarten der methode sind allerdings möglich
-> Direktgestreute Datei
-> Random Access File  (nur Satzsperre nötig)
-> Baumstruktur

Harzliche Grüße vom Berg
http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau