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