Mailinglisten-Archive |
Hallo Markus, Am Samstag, 26. November 2005 17:56 schrieb Weissbierwaldi: > Hi > > ich habe eine ziehmlich simple Frage. > Wie kann ich die letzte Zeile aus einer Datei löschen oder überschreiben? > Danke schonmal. gute Frage... :-) Ich habe in den Dateisystemfunktionen keine gefunden, mit deren Hilfe man den Dateizeiger direkt an den Anfang einer bestimmten Zeile setzen kann. Immerhin gibt es aber die Funktion ftruncate(), mit der man eine Datei auf eine bestimmte Länge kürzen kann: http://de.php.net/manual/en/function.ftruncate.php Um also die letzte Zeile aus einer Datei zu löschen, mußt Du die Länge der Zeile kennen und dann von der Gesamtgröße der Datei abziehen. So erhältst Du die Dateigröße, auf die Du die Datei kürzen mußt. Ich habe mir überlegt, daß man einfach die Datei zeilenweise mit fgets() ausliest und sich immer nur den Inhalt der aktuellen Zeile merkt. Wenn man die letzte Zeile erreicht hat, ermittelt man deren Zeilenlänge, berechnet die neue Dateigröße und reduziert die Datei auf diese. Wenn Du die Datei im Modus "a" oder "a+" geöffnet hast, kannst Du nach dem ftruncate() mit fwrite() direkt den neuen Inhalt der Zeile einfügen. :-) Hier ein von mir getestetes Beispiel: <?php $sDateiInhalt = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'; $sDateiInhalt .= "\n<html>\n"; $sDateiInhalt .= " <head>\n"; $sDateiInhalt .= " <title>Demo</title>\n"; $sDateiInhalt .= " </head>\n"; $sDateiInhalt .= " <body>\n"; $sDateiInhalt .= " <h1>Demo</h1>\n"; $sDateiInhalt .= " <p>Wie entferne ich die letzte Zeile einer Datei?</p>\n"; $sDateiInhalt .= " </body>\n"; $sDateiInhalt .= "</html>\n"; $sDateiInhalt .= "<!-- Dieser HTML-Kommentar soll entfernt werden! -->"; $sDateiName = 'test.txt'; $rDatei = fopen($sDateiName,'w'); fwrite($rDatei, $sDateiInhalt); fclose($rDatei); echo('<pre>'.htmlentities(implode('', file($sDateiName))).'</pre>'); $rDatei = fopen($sDateiName,'a+'); rewind($rDatei); $iZeileLaenge = 0; while (!feof($rDatei)) { $sZeile = fgets($rDatei); if (feof($rDatei)) { $iZeileLaenge = strlen($sZeile); ftruncate($rDatei, (filesize($sDateiName)-$iZeileLaenge-1)); } } echo('<pre>'.htmlentities(implode('', file($sDateiName))).'</pre>'); fwrite($rDatei, "\n<!-- Bisheriger HTML-Kommentar überschrieben! :-) -->"); fclose($rDatei); echo('<pre>'.htmlentities(implode('', file($sDateiName))).'</pre>'); ?> Vielleicht gibt es eine einfachere Lösung, aber das ist die beste, die ich hinbekommen habe. Im Beispiel durchlaufe ich zwar die gesamte Datei, es wird aber immer nur die aktuelle Zeile im Speicher gehalten. Viele Grüße Lutz
php::bar PHP Wiki - Listenarchive