FeGm: Letzte Zeile einer Datei löschen

Hallo!

ich möchte ein PHP Skript bauen, das wenn ic hes aufrufe die letzte Zeile einer Datei löscht.

Wie geht sowas?

mfg, FeGm

  1. Hi,

    ich möchte ein PHP Skript bauen, das wenn ic hes aufrufe die letzte Zeile einer Datei löscht.

    Datei öffnen (fopen), Datei einlesen (while, feof, fgets) und dabei jede Zeile als Element in ein Array einfügen, Datei locken (flock), letzten Eintrag aus dem Array entfernen (array_slice), Array wieder zusammensetzen (implode), Daten zurückschreiben (fwrite), Datei schließen (fclose).

    Schöne Grüße
    Julian

  2. echo $begrüßung;

    ich möchte ein PHP Skript bauen, das wenn ic hes aufrufe die letzte Zeile einer Datei löscht.

    Wenn die Datei nicht zu groß ist:
    Einlesen in einen String mittels file_get_contents(), ermittle die Position des letzten Zeilenumbruchs mit strrpos(), und schneide dann mit ftruncate() (plus fopen() und fclose()) ab.

    Oder: Einlesen mittels file(), letztes Array-Element löschen, implode()ieren und schreiben.

    Wenn die Datei sehr groß ist und du sie nicht in Gänze dem Arbeitsspeicher zumuten möchtest:
    Lese-Datei(1) öffnen mit fopen(), zweite Datei(2) zum Schreiben öffnen, solange das Ende von 1 noch nicht erreicht ist: wenn eine gemerkte Zeile vorhanden ist, diese nach 2 schreiben, Zeile aus 1 mittels fgets() lesen und merken. 1 und 2 schließen, 1 löschen und 2 umbenennen.

    Gegebenenfalls müssen Zweitzugriffe während des Änderungsprozesses verhindert werden. flock() hilft dabei.

    echo "$verabschiedung $name";

    1. Hallo,

      Wenn die Datei nicht zu groß ist:

      davon sollte im Zweifel immer ausgegangen werden. Das Einlesen eines gesamten Files in den Arbeitsspeicher (wie es die vorgeschlagenen Funktion file_get_contents() und file() tun würden) ist absolut nicht notwendig:

      $f='filename';  
      $c=0;  
      $l=0;  
      $s=[link:http://de3.php.net/manual/de/function.filesize.php@title=filesize]($f);  
      $dat=[link:http://de3.php.net/manual/de/function.fopen.php@title=fopen]($f,'r+');  
      [link:http://de3.php.net/manual/de/control-structures.while.php@title=while]([link:http://de3.php.net/manual/de/function.ftell.php@title=ftell]($dat)!=$s){  
              $c+=$l;  
              $l=0;  
              [link:http://de3.php.net/manual/de/control-structures.do.while.php@title=do]{$l+=[link:http://de3.php.net/manual/de/function.strlen.php@title=strlen]($t=[link:http://de3.php.net/manual/de/function.fgets.php@title=fgets]($dat,128));}while([link:http://de3.php.net/manual/de/function.substr.php@title=substr]($t,-1)!="\n");  
      }  
      [link:http://de3.php.net/manual/de/function.fseek.php@title=fseek]($dat,$c,SEEK_SET);  
      [link:http://de3.php.net/manual/de/function.ftruncate.php@title=ftruncate]($dat,$c);  
      [link:http://de3.php.net/manual/de/function.fclose.php@title=fclose]($dat);
      

      Gegebenenfalls müssen Zweitzugriffe während des Änderungsprozesses verhindert werden. flock() hilft dabei.

      Auf der Funktionsseite bitte dringlichst die Warnung beachten!

      Gruß aus Berlin!
      eddi