Der Beitrag ist zwar schon sehr alt, aber ich habe ein Problem damit und ich wundere mich, dass niemand anderes dieses Problem bemerkt:
Wenn ich Dateien mit dieser Funktion in einer Schleife kopiere, dann läuft mein Statusbalken gleichmäßig voll, verharrt dann aber relativ lange an seiner letzten Position bis er mit der nächsten Datei fortfährt. Und der Grund dafür ist die Zeile:
CloseFile dauert relativ lange (nennenswert lange im Vergleich zur Gesamtdauer des Kopiervorgangs).
Das ist sehr schade, da die Funktion dadurch unbrauchbar wird.
Ich habe dann das ganze auch nochmal mit Streams geschrieben, aber ich sehe das gleiche Verhalten - nur diesmal in der Zeile:
Code:
outStream.Free; // das hier dauert sehr lange!!!
gesamter Code der Stream-Variante:
Code:
function FastFileCopy2(const InFileName, OutFileName: string; CallBack: TProgressCallBack; doneBefore: int64; total: int64; mustCancel: TBoolFunction): boolean;
const
BufSize = 3 * 4 * 4096; { 48Kbytes gives me the best results }
var
done, thisSize: int64;
outStream,inStream:TFileStream;
begin
result := false;
if (InFileName <> OutFileName) then begin
outStream := TFileStream.Create(OutFileName, fmCreate);
inStream := TFileStream.Create(InFileName, fmOpenRead);
try
thisSize := inStream.Size;
if total = 0 then begin
total := thisSize;
doneBefore := 0;
end;
while (inStream.Position+BufSize<=thisSize) and not mustCancel do begin
outStream.CopyFrom(inStream,BufSize);
CallBack(inStream.Position+doneBefore,total);
end;
if not MustCancel then begin
outStream.CopyFrom(inStream,inStream.Size-inStream.Position);
CallBack(inStream.Position+doneBefore,total);
//FileSetDate(TFileRec(outfile).Handle, FileGetDate(TFileRec(infile).Handle));
result := true;
end
finally
outStream.Free; // das hier dauert sehr lange!!!
inStream.Free;
end;
end;
end; {FastFileCopy2}
Warum ist das so? Kann ich irgendwie entgegenwirken?