Tom: Dateifunktionen unter Windows

Beitrag lesen

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