Ich schreib gerade ein kleines Tool, das mir u.a. Dateien auf einen USB-Stick kopiert.
Ich haette fuer den Kopiervorgang gerne eine Progressbar-Anzeige, daher moechte ich kein CopyFile() nutzen.
Jetzt habe ich hier zwei Varianten, die aber einen enorm langsamen Datendurchsatz haben:
Variante 1:
Delphi-Quellcode:
S := TFileStream.Create( sourcefilename, fmOpenRead );
try
T := TFileStream.Create( targetfilename,
fmOpenWrite or fmCreate );
try
T.CopyFrom(S, S.Size ) ;
finally
T.Free;
end;
finally
S.Free;
end;
Variante 2:
Delphi-Quellcode:
buffersize := 10000;
AssignFile(f1, sourcefilename);
AssignFile(f2, targetfilename);
{$I-}
reset(f1,1);
rewrite(f2,1);
{$I+}
if IOResult<>0 then
begin
result := false;
exit;
end;
gel := 0;
ges := 0;
GetMem(buffer, buffersize);
repeat
{$I-1}
blockread(f1, buffer^, buffersize, gel);
blockwrite(f2, buffer^, gel, ges);
{$I+}
fehler := IOResult;
Application.ProcessMessages;
until (gel=0) or (ges<>gel) or (fehler<>0);
if fehler<>0 then
begin
FreeMem(buffer, buffersize);
result := false;
exit;
end;
CloseFile(f1);
CloseFile(f2);
FreeMem(buffer, buffersize);
Variante 3 ist CopyFile().
Eine Testdatei von 2969KB brauchte zum Kopieren auf den USB-Stick (auf die Festplatte)
Variante 1: 137,375 Sekunden = 21KB/s (140ms, 21MB/s)
Variante 2: 23,937 Sekunden = 124 KB/s (109ms, 27MB/s)
Variante 3: 3,344 Sekunden = 888 KB/s (47ms, 63MB/s)
Fuer einen direkten Kopiervorgang ueber den Explorer habe ich eine groessere Datei genommen, da ich die Zeit ja manuell stoppen musste:
41,7 MB in 20,63s = 2 MB/s (vom Loslassen der Datei bis zum Verschwinden des Fensters mit der Progressbar)
Bin jetzt verwirrt...
Was stimmt mit den Varianten 1 und 2 nicht? Warum ist CopyFile langsamer als das direkte Kopieren? Schummelt der Explorer (Schreibcache?)?
[edit=Luckie]Wir haben auch Delphi-Tags. Mfg, Luckie[/edit]