Mode einer geöffneten Datei überprüfen
mabuhay
- php
Hi,
Gibt es eine Möglichkeit, den mode einer geöffneten Datei (r, w, a, usw) nachträglich zu überprüfen? Also um sicherzustellen dass die Datei mit dem richtigen mode-Parameter geöffnet wurde?
mfg
mabuhay
Ich grüsse den Cosmos,
Also um sicherzustellen dass die Datei mit dem richtigen mode-Parameter geöffnet wurde?
Das stellt PHP sicher, wenn du den richtigen Parameter angibst. Ich versteh den Sinn nicht wirklich, den Interpreter zu kontrollieren, ob der das, was man ihm sagt, richtig macht. (Zumindest in diesem Fall)
Möge das "Self" mit euch sein
Hi,
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.
mfg
mabuhay
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
Hello,
Gibt es eine Möglichkeit, den mode einer geöffneten Datei (r, w, a, usw) nachträglich zu überprüfen? Also um sicherzustellen dass die Datei mit dem richtigen mode-Parameter geöffnet wurde?
Gegen Alzheimer hilft hier nur Fleiß:
Auf das vorhandene Handle ein Lock_sh legen
ein neues Handle besorgen mit dem gewünschten Mode
auf das neue Handle ein Lock_sh legen
den Satzzeiger des alten Handles abfragen
das alten handle freigeben
den Satzzeiger für das neue Handle wieder positionieren
auf lock_ex upgraden, falls notwendig
Daten lesen
Datenn verändern
Daten schreiben
Datei schließen und Tschüss
An den Speicherblock des Handles wird dich das OS vermutlich nicht einmal zum Auslesen heranlassen und mit Standardmitteln von PHP schon gar nicht.
Sollte mich jedenfalls wundern.
Außerdem ginge das in eine Schicht, in der Anwendungsprogrammierer nicht zu suchen haben.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom