Tom: Dateifunktionen unter Windows

Beitrag lesen

Hello,

Das ist mir klar. Aber da entsteht ein Time Gap, wenn die Datei NICHT vorhanden ist, und daher angelegt werden muss. Der a+-Mode macht das in einem Zug und man muss das Handle nicht wieder hergeben.

Ich muss zugeben, dass ich davon ausgegangen bin, die Datei existiert. Dennoch ist der a+-Modus, der zwar in diesem speziellen Fall bequemer (und wahrscheinlich auch schneller) ist, m.E. der falsche Weg.

Bliebe noch der x+-Mode, aber den gibt es erst ab PHP 4.3.2

...und bricht im Falle der Existenz ab. Man müsste also trotzdem auf Existenz prüfen.

Ja, erst Öffnungsversuch mit r+ und wenn der schief geht die erweiterte Fehlermeldung einholen. Wenn die sagt "File not found" dann mit x+ anlegen. Wenn das auch schief geht, weil inzwischen "File already exists", war eben jemand anders schneller. dann kann man wieder mit r+ anfangen. Wenn das dann endlich klappt, kann man mit dem Lockversuch starten.

  • fopen('r+b')    ## wenn die Datei nicht vorhanden ist, könnte man sie anschließend gleich
                        ## mit w+ aufrufen. Dabei könnte es aber passieren, dass jemand zwischen
                        ## r+ -> Fehler und w+ die Datei bereits gesperrt hat, wovon w+ aber
                        ## bei advisory Locking leider nichts mitbekommt. Und futsch ist die neue
                        ## Datei des Anderen Prozesses.
                        ## bleibt also zum Anlegen nur das Verzeichnis-Locking.

Ich würde mir das eher so vorstellen:

<?php

if (!file_exists($dateiname))
{
    touch($dateiname);
}

fopen($dateiname, 'r+b');

// ...

?>

Das ist IMHO der sauberste Weg. Dieses Vorgehen sollte zeitkritisch kein Problem sein (etwas anderes dürfte der a+-Mode ja auch nicht machen) und das Problem mit dem advisory Locking hätte sich auch erledigt. Alternativ könnte man die Datei natürlich im Falle der Nicht-Existenz mit w+ öffnen und in einem else-Teil mit r+ - das dürfte aber keinen Unterschied machen.

Das ist leider nicht der richtige Weg, da zwischen file_exists(), touch() und dem nachfolgenden fopen(r+) immer riesen Zeitschlitze existieren, in denen ganz schlimme Sachen passieren können.

Touch arbeitet über Namen und man kann keinen Advisory Lock auf die Datei prüfen, bevor es aufgerufen wird. Allerdings ändert es ja auch nichts am Inhalt, sondern nur an der Inode oder im VFAT.

Weißt Du, wo man die Sourcen für PHP auf Windows finden kann? Ich habe schon alles mögliche durchgesucht. Ich will mir das gerne mal ansehen, wie die Filefunktionen implementiert sind.

Leider nicht - ich werde mich aber auch mal auf die Suche machen.

Erstmal aber noch mein Dank für die Unterstützung; ich hoffe er erreicht Dich auch.

tut er. War aber selbstverständlich - dein Artikel interessiert mich auch ;-)

Aber ich komme vom Hundertstel ins Tausendstel. Und schließlich soll ja nchher alles stimmen, was ich da so zusammenschreibe. Ich suche jetzt erstmal die Stelle in den Sourcen für Linux, an der fopen(a+) definiert ist. Mal sehen, ob ich da durchsteige.

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

Tom

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