Ich hab nun sleber eine Lösung, ich denke es gibt auch shcnellere Lösungen, für Hinweise in die Richtung wäre ich dankbar. Auch wenn das Aktuelle für mich vollkommen ausreicht.
Dies hat mein Problem ersteinmal gelößt.
Delphi-Quellcode:
if filepos(f) > Length(workBuf) then
seek(f, filepos(f)-Length(workBuf));
Ausserdem habe ich noch andere "Bugs" behoben:
- Dateien können kleiner < buf bytes sein
- Nur tatsächlich neu ausgelesenes wird behandelt
Delphi-Quellcode:
procedure TForm1.PatchFile(const path, searchFor, replaceWith:string);
var
r,i,j:integer;
f: file of byte;
offset:array of integer;
buf:array [0..1023] of byte;
workBuf:array of byte;
begin
ProgressBar.Max := GetFileSizeEx(path);
ProgressBar.Position := 0;
//searchFor -> workbuf
SetLength(workBuf, Length(searchFor));
for i:=0 to Length(workBuf)-1 do
workBuf[i]:=Ord(searchFor[i+1]);
//Durchsuchen
assignfile(f,path);
reset(f);
repeat
if filepos(f) > Length(workBuf) then
seek(f, filepos(f)-Length(workBuf));
blockread(f,buf,Length(buf),r);
ProgressBar.StepBy(Length(buf));
//buf nach workBuf durchsuchen
for i:=0 to Length(buf)-1 do //buf durchgehen
begin
if i >= r then break; //Ausserhalb des Buffers abbrechen
for j := 0 to Length(workBuf)-1 do //Suchstring bei i durchgehen
begin
if buf[i+j] = workBuf[j] then //Anfang gefunden!
begin
if j = Length(workBuf)-1 then //Komplett gefunden!
begin
SetLength(offset,Length(offset)+1);
offset[Length(offset)-1] := filepos(f) - r + i;
//offset[n] gibt die Position des workBuf[0] wieder
end;
end else //Nicht kmoplett gefgunden!
begin
break;
end;
end;// for
end;
until r < Length(Buf);
//Alles was gefunden wurde steht in offset...
//Gefundenes ersetztn:
//replaceWith -> als Byte -> workBuf
SetLength(workBuf,Length(replaceWith)+1);
for i:=0 to Length(workBuf)-1 do
workBuf[i] := Ord(replaceWith[i+1]);
//An jedem Offset ersetzen:
for i:=0 to Length(offset)-1 do
begin
Seek(f, offset[i]);
BlockWrite(f, workBuf[0], Length(workBuf),r);
end;
closefile(f);
end;
Da es nun fertig ist würde ich mich über Verbesserungsvorschläge und Kritik freuen.