Tom: Mode einer geöffneten Datei überprüfen

Beitrag lesen

Hello,

Wollte mir ein paar Funktionen zusammenstellen, z.B. Datei öffnen oder eine Zeile zu einer geöffneten Datei hinzufügen usw. mit validation aller parameter usw., da wollte ich testen ob die Datei auch zum Anhängen geöffnet worden ist damit ich sie möglichst flexibel verwenden kann...
Löse es jetzt aber einfach so dass die öffnen Funktion die Datei halt einfach mit dem "a" mode öffnet oder so ähnlich, falls es da wirklich nichts gibt.

Der Append-Modus ist nun auch in PHP schon eine Weile repariert.
Da kannst Du wirklich nur am Ende etwas anhängen und den Satzzeiger (für das Schreiben) nicht bewegen. Der tut nur so, als würde er parieren ;-))

Wenn Du den a+ Modus nimmst, kannst Du aber in der Datei lesen.

http://de3.php.net/manual/de/function.fopen.php

Eine universelle Öffnungsprozedur für eine Datei habe ich neulich hier beschrieben.
Ich weiß aber nicht mehr, in welchem Thread, deshalb poste ich sie einfach nochmal:

Datei zerstörungsfrei öffen oder anlegen, wenn
sie noch nicht vorhanden war:

$fh1 = fopen($dateiname, 'a');              ## Datei erzeugen, falls nicht vorhanden
  flock ($fh1, LOCK_SH);                      ## Datei mit Sperre gegen Schreibsperre belegen
  $fh2 = fopen($dateiname, 'r+');             ## Datei zum Lesen und Schreiben öffnen
  flock ($fh2, LOCK_SH);                      ## Ebenfalls Sperre gegen Schreibsperre setzen
  fclose($fh1);                               ## ggf. neu erzeugte Datei frei geben (schließen)
  flock ($fh2, LOCK_EX);                      ## Sperre auf Schreibsperre 'upgraden'
  clearstatcache;                             ## eventuell alte Metadaten entfernen
  $fsize = filesize($dateiname);              ## Dateigröße holen
  $stream = fread($fh2, $fsize);              ## Datei auslesen
  $_schmeckt = unserialize($stream);          ## Stream in Array zurückverwandeln
  ### Manipulationen am Array durchführen     ## Hier das Array verändern
  $stream = serialize($_schmeckt);            ## Array wieder in Stream umwandeln
  fseek($fh2, 0, SEEK_SET);                   ## Datensatzzeiger zurück auf Anfang
  fwrite($fh2,$stream);                       ## verändertes Array wegschreiben
  ftruncate($fh, strlen($strem));             ## Dateilänge anpassen auf veränderten Inhalt
  fclose($fh);                                ## Datei schließen und freigeben.

In diesem Besipiel lag in der Datei, wenn sie vorhanden war, ein serialisiertes Array.
Dieses sollte verändert werden.

Es ist der einzige Weg, wie Applikationen vorgehen müssen, wenn die Daten Applikationsübergreifens genutzt werden sollen. Sogenannte "Dummyfiles" sind da zum Schutz nicht geeignet, weil die andere Applikation zwar dasselebe OS benutzt, also die Lockmethoden zur Verfügung hat, aber nicht wissem kann, wie das Dummyfile heißt.

Die Dateien werden hier nicht wirklich gesperrt, sondern es wird für sie im OS eine Informationstabelle geführt. Alle Applikationen können darauf zugreifen und sollten es auch tun.
Das nennt sich dann Advisory Locking, im Gegensatz zu Mandatory Locking, wo das Betriebssystem nicht nur die Informationstabelle führt, siondern auch die Überwachung betreibt.

Das Beispiel berücksichtigt noch nicht die Fehlerauswertung, die aber unbedingt berückscihtigt werden muss. Hier sollte nur der notwendige zeitliche Verlauf des Vorganges dargestellt werden.
Man zerlegt den Ablauf zweckmäßigerweise in mehrere Funktionen. Dann wird es mit den Fehlervarianten nicht zu unübersichtlich.

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

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)