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