phpbar.de logo

Mailinglisten-Archive

Re: [php] Letzte Zeile aus einer Datei löschen

Re: [php] Letzte Zeile aus einer Datei löschen

Weissbierwaldi weissbierwaldi at gmail.com
Son Nov 27 09:43:55 CET 2005


Danke.

Wenn das so kompliziert ist dann mache ich ne Kopie vonder Datei bei
mir heist sie proxychain.conf und die Kopie heist denn z.B.
proxychain.conf.back.
Wenn sich jetzt die letzte Zeile ändern soll lösche ich die
proxychain.conf, kopiere die Datei proxychain.conf.back nach
proxychain.conf und hänge die letzte Zeile an.

Ich denke mal so ist das am einfachsten da es ja leider keine Funktion
gibt den Dateizeiger in bestimmte Zeilen zu verschieben.

Danke

Markus Minini

Am 26.11.05 schrieb Lutz Zetzsche <Lutz.Zetzsche at sea-rescue.de>:
> 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
> --
> ** Allgemeine deutschsprachige PHP-Liste: php at phpbar.de **
> Informationen: http://www.phpbar.de
> http://lists.phpbar.de/mailman/listinfo/php
>

php::bar PHP Wiki   -   Listenarchive