Hello,
die Funktion ist generell recht nutzlos, denn was nützt Dir die Ermittlung eines neuen Dateinamens, wenn Du nicht gleich auch eine Datei unter diesem Namen anlegst? In der Zeitlücke zwischen der Abfrage "Ist die Datei schon vorhanden" und dem späteren Anlegen der Datei unter dem ermittelten Namen kann diese bereits unter demselben Namen von einem anderen Prozess angelegt worden sein.
Das nennt man dann TOCTOU-Fehler http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Die meisten Filesysteme bieten daher die Möglichkeit, Dateien unter einem (neuen) Namen nur dann erstellen zu lassen, wenn diese NOCH NICHT VORHANDEN sind. Diese Arbeitsschrrtte sind dann schon vom Filesystem (als Bestandteil des Betriebssystemes) als atomistischer Prozess gekapselt und daher sicher.
PHP bietet diese Möglichkeit durch Verwendung des 'X'-File-Modus .
http://de2.php.net/manual/en/function.fopen.php
Die einzig richtige Lösung für diese Aufgabenstellung ist daher die sofortige Erzeugung eines neuen Handles auf den neuen Filenamen und die sofortige exclusive Sperre der Datei mit LOCK_EX.
Dabei müssen dann auch diverse Fehlermöglichkeiten berücksichtigt werden:
-
Das Verzeichnis, in dem die Datei erstellt werden soll, ich nicht vorhanden
-
Das Verzeichnis, in dem die Datei erstellt werden soll, lässt sich nicht anlegen
-
In dem Verzeichnis, in dem die Datei erstellt soll, darf nicht geschrieben werden
-
Datei lässt sich problemlos anlegen (kein Fehler, aber es geht ja noch weiter...)
-
Die gerade angelegte Datei lässt sich nicht exclusiv sperren
(unwahrscheinlich, aber nicht unmöglich)
Wenn alles geklappt hat, kann das erzeugte Handle sofort benutzt werden. Trat ein Fehler auf, muss das Programm entsprechend sinnvoll darauf reagieren.
Es sollten also das neue Handle und ein Fehlercode zurückgegeben werden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg