Einzelnen Beitrag anzeigen

Dax
(Gast)

n/a Beiträge
 
#1

Suchen und ersetzen in Dateien

  Alt 2. Jul 2006, 12:59
Quick_silver zeigt in diesem Beitrag, wie man in Dateien nach bestimmten Strings suchen und diese ersetzen kann, unter Verwendung von Pascal-Files:
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 komplett gefunden!
        begin
          break;
        end;
      end;// for
    end;
  until r < Length(Buf);

  //Alles was gefunden wurde steht in offset...
  //Gefundenes ersetzen:

  //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;
  Mit Zitat antworten Zitat