phpbar.de logo

Mailinglisten-Archive

[php] Letzte Zeile aus einer Datei löschen

[php] Letzte Zeile aus einer Datei löschen

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Sam Nov 26 23:16:51 CET 2005


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