Einzelnen Beitrag anzeigen

Quick_silver

Registriert seit: 2. Jan 2003
78 Beiträge
 
Delphi 6 Enterprise
 

Re: Datei an bestimmten Offsets editieren

  Alt 2. Jul 2006, 09:57
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.
  Mit Zitat antworten Zitat