Einzelnen Beitrag anzeigen

Kharlanki

Registriert seit: 9. Jul 2003
Ort: Düsseldorf
50 Beiträge
 
#1

Dateien auf USB-Stick kopieren

  Alt 31. Okt 2009, 22:35
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]
Gruss,
Matthias

  Mit Zitat antworten Zitat