de.comp.lang.php.* FAQ

13.4. Wie kann ich in einer Datei eine Zeile einfügen oder löschen?

Antwort von Kristian Köhntopp

Für dieses Problem gibt es keine elegante oder effiziente Lösung. Die Ursache liegt darin, wie Unix und Windows die unterliegenden Dateien handhaben, nämlich als unstrukturierte Byteströme. Für diese Byteströme gibt es keine Indices und auch keine Methoden, mit denen man effizient beliebige Teile der Datei löschen oder in die Datei einfügen könnte.

Tatsächlich ist der Wunsch nach einfachen Einfüge- und Löschoperationen der Auslöser für die Schaffung von Datenbankfunktionen wie die DBM-Funktionen oder von ganzen Datenbanken wie MySQL gewesen. Wenn man auf diese Sorte Problem trifft, sollte man also intensiv über den Einsatz von DBM-Dateien oder Datenbanken nachdenken.

Um in einer Datei eine Zeile einzufügen oder zu löschen, muss man die Datei öffnen und zeilenweise durchlesen und in eine zweite Datei schreiben. Erreicht man die gewünschte Position, muss man dort eine Zeile einfügen oder löschen. Nach Abschluß der Operation ist die Originaldatei zu löschen und die neue Datei umzubenennen. Dabei ist zu beachten, dass in einer Webumgebung ohne weiteres mehrere Benutzer zugleich eine solche Operation für dieselbe Datei anfordern können. Man muss also auch durch Locking dafür Sorge tragen, dass sich diese Benutzer nicht in die Quere kommen.


// Shared lock auf die Quelldatei
$old = fopen($oldfile, "r");
flock($old, 1) or die("Kann die Quelldatei $oldfile nicht locken.");

// Exclusive lock auf die Zieldatei
$new = fopen($oldfile.".new", "w");
flock($new, 2) or die("Kann die Zieldatei $newfile nicht locken.");

$lineno = 0;

while($line = fgets($old, 1024)) {
  if ($lineno++ == $zielzeile)
    continue;  // Zeile auslassen

  fputs($new, $line);
}

fclose($old); // Gibt das Lock automatisch auf

// Alte Datei wegwerfen.
unlink($oldfile);

// Neue Datei umbenennen.
// (In Windows müssen das rename() und das fclose($new)
//  vertauscht werden, da es nicht möglich ist, in Windows
//  eine offene Datei umzubenennen.
rename($oldfile.".new", $oldfile);

// Neue Datei schließen und dabei Lock aufgeben.
fclose($new);

Valid HTML 4.01! Valid CSS!

13.4. Wie kann ich in einer Datei eine Zeile einfügen oder löschen?
http://www.php-faq.de/q/q-datei-einfuegen.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team