Code:
function file2string(filename:string):string;
var f: file of char;
begin
result := '';
if fileexists(filename) then
begin
assignfile(f,filename);
reset(f);
[color=#ff0000]SetLength(Result, FileSize(f));
BlockRead(f, Result, FileSize(f));[/color]
closefile(f);
end;
end;
function strreplace(s,what, whit:string; var count:integer):string;
var lastfound: integer;
begin
count := 0;
result := s;
if (what = '') or (whit = '') then exit;
lastfound := 0;
[color=#ff0000]what := uppercase(what);[/color]
while [color=#ff0000]PosEx(what, uppercase(result), lastfound[/color]) > 0 do
begin
inc(count);
lastfound := lastfound + pos(what, uppercase(copy(result,lastfound+1,length(result))));
result := copy(result,1,lastfound-1) + whit + copy(result,lastfound + length(what),length(result));
lastfound := lastfound - (length(what)-length(whit));
end;
end;
function string2file(filename, aString: string; appendmode:boolean):boolean;
var f: textfile;//file of char;
begin
assignfile(f,filename);
if appendmode then append(f) else rewrite(f);
[color=#ff0000]Write(f, aString);//BlockWrite(f, aString, Length(aString));[/color]
closefile(f);
result := true;
end;
procedure TForm1.okButtonClick(Sender: TObject);
var
dateiname: string;
mystring: string;
c: integer;
begin
dateiname := 'gbuch.txt';
[color=#ff0000]myString := file2string('gbuch.txt');[/color] [color=#ff00ff]<< die Datei muß natürlich auch eingelesen werden[/color]
mystring := strreplace(mystring,'@','[at]',c);
string2file('gbuch.txt', myString, false);
showmessage('es wurden ' + inttostr(c) + ' einträge ersetzt');
//IdFTP1.Put(dateiname, dateiname);
end;
Der Grund, warum die Datei gelöscht wird:
okButtonClick > Datei nicht eingelesen
Tempo:
Den Grund hat yankee schon gesagt ... zeichenweises Einlesen ist nicht gerade schnell.
Aber nicht unbedingt bei jedem Zeichen ... der MemoryManager von Delphi ändert den Speicher nur alle etwa 4 Zichen.
uppercase(what):
Wozu denn jedesmal von Neuem umwandeln ... einmal reicht auch
Pos > PosEx:
PosEx sucht nur noch aber der letzten Fundstelle, wärend Pos immer wieder den gesamten String durchsucht.
Also braucht man nicht erst einen Teilstring kopieren und jedesmal dafür Speicher reservieren und freigeben.
Das strreplace kann man auch einfacher machen, wobei aber der Vorteil von PosEx verloren geht:
Delphi-Quellcode:
function strreplace(s,what, whit:string; var count:integer):string;
begin
count := 0;
result := s;
if (what = '') or (whit = '') then exit;
what := uppercase(what);
while Pos(what, uppercase(result)) > 0 do
begin
inc(count);
Result := StringReplace(Result, what, whit, [rfIgnoreCase]);
end;
end;