Zeile in einer Datei löschen?
Moinsen,
ich bin grerade dabei eine Datenbank zu programmieren. Die einzelnen Einträge werden in eine Datei gespeichert. Jetzt soll das Programm natürlich die Funktion haben Einträge zu löschen. Und genau da liegt das Problem. Um die gewünschte Zeile zu bekommen, lasse ich den User einen String übergeben, der in dieser Zeile vorkommt. Dann gehe ich mit einem BufferedReader die ganze Datei durch und suche die entsprechende Zeile. Ich weiß jetzt aber nicht, wie ich diese Zeile löschen kann, wenn ich sie gefunden habe. hat jemand ne Idee?
3 Antworten
Vorgehensweise:
Öffne Datei zum Lesen, öffne Neue Datei zum schreiben, lock() beide Dateien, lies aus Datei 1, Zeilen die erhalten beleiben werden in Datei 2 geschrieben. Wenn fertig, lösche Datei 1, Benenne Datei 2 um und entferne Lock.
Achtung, das Umbenennen kann potentiell immernoch zu einem Race führen.
Man kann das Ganze auch inplace machen, indem man geschickt den Filepointer bewegt und dann inplace umherschiebt - nur willst Du dabei keinen Fehlerfall erleben :D.
ein datensatz hat doch eigentlich eine ID , beim löschen nimmt man die ID bzw vergleichbares primäre feld.
mit suchfunktion und matching ist man extrem auf der falschen seite , was passiert wenn der string auch noch woanders vorkommt ?
ich mach sowas immer mit einer XML struktur , einlesen als array von datensätzen. entsprechend wird die datei neu geschrieben aus dem veränderten array . direkte manipulations von dateien mit seek etc ist nicht zielführend .
fazit eintrag löschen im speicher und dann datei wieder schreiben .
Da gibt es mehrere Möglichkeiten.
Ob am effizientesten, weiß ich nicht, aber du könntest die Datei Zeilenweise lesen und alle Zeilen, die den Suchstring nicht enthalten, in einen Schreibpuffer schreiben. Nach dem Lesen der Datei schreibst überschreibst du sie mit dem Schreibpuffer.
Noch besser, aber in der Vorbereitung etwas aufwändiger wäre es, wenn du mit Regulären Ausdrücken arbeiten würdest. Dann liest du die Datei komplett und ersetzt die Zeile mit dem Match durch einen Leerstring und schreibst das Ergebnis zurück in die Datei (überschreiben).
Als dritte Variante könntest du einmal schauen, ob du die Datei in ein Listenobjekt einlesen kannst.
Ein Listenobjekt ist so etwas ähnliches wie ein Textarray, nur mit mehreren Methoden, die zur Verfügung stehen. Als Trennzeichen gibst du das Zeilenendezeichen an.
Wenn das Objekt nicht sowieso schon eine Suche erlaubt und den Index mit dem Fund zurück gibt, iterierst du durch das Objekt. Das Listenobjekt hat meistens eine Methode, um eine Zeile zu löschen. Wenn es die Methode gibt, mit der man das Listenobjekt aus einer Datei heraus befüllen kann, gibt es ganz bestimmt auch eine, mit der du es in die Datei zurück schreiben kannst.
Vom Schema her:
- Liste.Separator = "\n"
- Liste.Load(Datei)
- if Liste.Find(Text)>=0 then Liste.Delete(Liste.Find(Text))
- Liste.SaveToFile(Datei)
Probiere ich gleich mal aus. Das könnte funktionieren.