Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Dateien / Laufwerke (https://www.delphipraxis.net/41-library-dateien-laufwerke/)
-   -   Delphi Suchen und ersetzen in Dateien (https://www.delphipraxis.net/72533-suchen-und-ersetzen-dateien.html)

Dax 2. Jul 2006 12:59


Suchen und ersetzen in Dateien
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz