Ändern oder Löschen einer Zeile aus einer Textdatei auf niedriger Ebene?

Ich arbeite mit einer Textdatei in Delphi und möchte die Methode zum Laden / Speichern mit einer Zeichenfolgenliste nicht verwenden. Ich beabsichtige, einen offenen Dateistream beizubehalten, in dem ich meine Daten lese und schreibe. Dabei werden große Datenmengen auf der Festplatte und nicht im Speicher gespeichert. Ich habe das einfache Konzept, neue Zeilen in eine Textdatei zu schreiben und diese zu lesen, aber wenn ich sie ändere und lösche, finde ich keine guten Ressourcen.

Jede Zeile in dieser Datei enthält einen Namen und ein Gleichheitszeichen, der Rest sind Daten. Zum Beispiel,SOMEUNIQUENAME=SomeStringValue. Ich beabsichtige, eine Datei für einen bestimmten Zeitraum innerhalb eines Threads offen zu halten. Dieser Thread führt eingehende Anforderungen aus, um bestimmte Datenfelder abzurufen, festzulegen oder zu löschen. ich benutzeWriteLn undReadLn in einer Schleife auswertenEOF. Unten ist ein Beispiel, wie ich die Daten gelesen habe:

FFile = TextFile;

...

function TFileWrapper.ReadData(const Name: String): String;
var
  S: String; //Temporary line to be parsed
  N: String; //Temporary name of field
begin
  Result:= '';
  Reset(FFile);
  while not EOF(FFile) do begin
    ReadLn(FFile, S);
    N:= UpperCase(Copy(S, 1, Pos('=', S)-1));
    if N = UpperCase(Name) then begin
      Delete(S, 1, Pos('=', S));
      Result:= S;
      Break;
    end;
  end;
end;

... und dann löse ich ein Ereignis aus, das den Absender über das Ergebnis informiert. Die Anforderungen befinden sich in einer Warteschlange, die eine Art Nachrichtenpumpe für diese Anforderungen darstellt. Der Thread verarbeitet die nächste Anforderung in der Warteschlange einfach wiederholt, ähnlich wie typische Anwendungen funktionieren.

Ich habe Prozeduren, mit denen ich diese Felder schreiben und löschen kann, aber ich weiß nicht, was ich tun muss, um die Aktion für die Datei auszuführen.

procedure TFileWrapper.WriteData(const Name, Value: String);
var
  S: String; //Temporary line to be parsed
  N: String; //Temporary name of field
begin
  Result:= '';
  Reset(FFile);
  while not EOF(FFile) do begin
    ReadLn(FFile, S);
    N:= UpperCase(Copy(S, 1, Pos('=', S)-1));
    if N = UpperCase(Name) then begin
      //How to re-write this line?
      Break;
    end;
  end;
end;

procedure TFileWrapper.DeleteData(const Name: String);
var
  S: String; //Temporary line to be parsed
  N: String; //Temporary name of field
begin
  Result:= '';
  Reset(FFile);
  while not EOF(FFile) do begin
    ReadLn(FFile, S);
    N:= UpperCase(Copy(S, 1, Pos('=', S)-1));
    if N = UpperCase(Name) then begin
      //How to delete this line?
      Break;
    end;
  end;
end;

Letztendlich muss ich vermeiden, dass die gesamte Datei in den Speicher geladen wird, um dies zu erreichen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage