Hello,
Es wäre auch möglich, das ftruncate($fh,0) direkt nach dem Bewegen des Dateizeigers auf Pos. 0 zu versuchen, und dann erst zu schreiben.
das funktioniert (gerade getestet), ich halte das aber für eine eher schlechte Idee, da die Performance bei großen Dateien doch erheblich schlechter sein dürfte.
Bei großen Dateien (ab 1MB) würde ich mir das auch verkneifen. In einem meiner Beispiele wird ein serialisiertes Array in der Datei gespeichert. Da muss man die gesamte Datei neu schreiben.
Letztendlich verstehe ich nur nicht, warum du eine Datei immer mit "a+b" öffnest, wenn du sie komplett überschreibst (den Inhalt also eh nicht erhalten möchtest). Für diesen Zweck würde sich m.E. eher das Öffnen im Lese-/Schreibzugriff (also "r+b") anbieten, was dann auf allen BS funktionieren müsste, also:
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. Bliebe noch der x+-Mode, aber den gibt es erst ab PHP 4.3.2
- 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.
- flock()
- fread()
- Daten bearbeiten
- rewind()
- fwrite()
- ftruncate()
- fclose()
So klappt's dann auch unter Windows (zumindest bei mir).
Welches System war das bei Dir?
Ich arbeite unter Windows 2000 SP4 mit Apache 2.0.49 und PHP 4.3.6
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.
Erstmal aber noch mein Dank für die Unterstützung; ich hoffe er erreicht Dich auch.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau