Hello,
das ist ja grauenhaft. Allerdings ist der Append-Mode bei DOSen der Text-Datei-Mode, der keine Dateinavigation zulässt. Wenn die das im Quellcode natürlich mit diesem alten INT implementieren in der WinDOS-Version, dann klappt es nicht. Unix kennt diese Unterscheidung nicht.
Wäre nett, wenn Du nochmals rückmelden könntest, ob "ab+" auch bei Windows funktioniert.
ich hatte die Datei bereits binär geöffnet (das war eine Ungenauigkeit in meinem vorigen Posting). Ich hab jetzt mal ein wenig getestet - es funktioniert bei mir definitiv nicht. Die Daten werden nach dem Öffnen im append mode _immer_ an das Ende der Datei gehängt, unabhängig von der Position des Dateizeigers, z.B.:
<?php
$fh = fopen('./test.txt', 'wb');
fwrite($fh, '123');
fclose($fh);
clearstatcache();
$fh = fopen('./test.txt', 'ab+');
echo 'seek: '.fseek($fh, 0, SEEK_SET).'<br />'; # Bei Fehler '-1
echo ftell($fh) . '<br />'; // Ausgabe: 0
clearstatcache();
fwrite($fh, '456');
fclose($fh);$fh = fopen('./test.txt', 'rb');
echo fread($fh, filesize('./test.txt')); // Ausgabe: 123456
fclose($fh);?>
Unter bugs.php.net bin ich außerdem auf zwei Kommentare eines PHP-Supporters gestoßen:
- "'a' mode forces the kernel to always write at the end of the file.
ftell() will give undefined results for append-only streams, as will
seeking. Writing to such a file should always be appended, regardless of the results from ftell()." (http://bugs.php.net/bug.php?id=24071)- "using fseek() and fwrite() on a file opened in append mode will lead to undefined results." (http://bugs.php.net/bug.php?id=29503)
Für mich hört sich das beschriebene Verhalten daher völlig normal an.
Ich lese aber überall nur vom 'a'-Mode und nicht vom 'ab+'-Mode.
Da müssen wir wohl in den Quellcode reinschauen, um zu wissen, wie es gemacht ist. Den für Windows habe ich aber nicht.
Wenn Du das noch einmal mit der clearstatcache-Variante ausprobiern könntest auf Deiner DOSe...
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.
Im DOS-API und auch in den erweiterten Interrupts (INT 21h) ist über Handle kein sequentieller Zugriff mehr vorgesehen, sondern nur noch wahlfreier. Es ist also eine Sacher der DTA-Implementierung bzw. der Blocktreiber, wie sich das System verhält. Das müsste also auch für PHP auf WinDOS zu handhaben sein.
Welches System war das bei Dir?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau