(Gast)
n/a Beiträge
|
Suchen und ersetzen in Dateien
2. Jul 2006, 13: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;
|
|
Zitat
|