Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Datei auf binärer Ebene bearbeiten?

  Alt 20. Jul 2006, 06:43
Guten Morgen.

Ein String ist vielleicht nicht die beste Wahl um eine Datei im Hauptspeicher zu bearbeiten - ich würde eher ein ByteArray verwenden:

Delphi-Quellcode:
uses
  Types;

function LoadFile(fn: TFileName; var bda: TByteDynArray): Boolean;
begin
  with TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite) do
  try
    SetLength(bda, Size);
    Result := Read(bda[0], Size) = Size;
  finally
    Free;
  end;
end;
Wenn die zu ändernden Stellen (Offset, Länge) bekannt sind, dann muss die Datei garnicht in den Hauptspeicher geladen werden. Ein patch file ist dann viel eleganter:

Code:
# offset=percent encoded string
2525=Hello%00
252B=Mary Lou%00
Die Datei kann mit TStringList.LoadFromFile() geladen und zeilenweise in einer Schleife verarbeitet werden:

Delphi-Quellcode:
uses
  IdURI;

function PercentToStr(const s: String): String;
begin
  Result := TIdURI.URLDecode(s);
end;

procedure PatchFile(fn: TFileName; patches: TStrings);
var
  i, iOffset: Integer;
  s: String;
begin
  with TFileStream.Create(fn, fmOpenReadWrite or fmShareDenyWrite) do
  begin
    for i := 0 to Pred(patches.Count) do
      if (Pos('#', patches[i]) <> 1)
      and TryStrToInt(patches.Names[i], iOffset) then
      begin
        Position := iOffset;
        s := PercentToStr(patches.ValueFromIndex[i]);
        Write(s[1], Length(s));
      end;
  end;
end;
Getippt, korrigiert und immer noch nicht getestet.

Grüße vom marabu
  Mit Zitat antworten Zitat