Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateien auf USB-Stick kopieren (https://www.delphipraxis.net/142646-dateien-auf-usb-stick-kopieren.html)

Kharlanki 31. Okt 2009 21:35


Dateien auf USB-Stick kopieren
 
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]

Luckie 31. Okt 2009 21:46

Re: Dateien auf USB-Stick kopieren
 
Guck dir mal MSDN-Library durchsuchenCopyFileEx an: http://www.michael-puff.de/Developer...pyFileEx.shtml

Aphton 31. Okt 2009 21:50

Re: Dateien auf USB-Stick kopieren
 
Schau dir bitte mal CopyFileEx() an

Code:
BOOL CopyFileEx(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  LPPROGRESS_ROUTINE lpProgressRoutine,
  LPVOID lpData,
  LPBOOL pbCancel,
  DWORD dwCopyFlags
);
Implementiere einfach eine Funktion die du als lpProgressRoutine-Parameter übergibts!

MfG

Luckie 31. Okt 2009 21:56

Re: Dateien auf USB-Stick kopieren
 
Was deine Zeitmessungen angeht: Das kannst du nicht vergleichen, weil Windows die Zugriffe cached.

@Aphton: Zu langsam. :tongue:

himitsu 31. Okt 2009 22:03

Re: Dateien auf USB-Stick kopieren
 
und vorallem:
wie hast du diese Zeiten gemessen?

Lesen:
- nach dem ersten Einlesen ist sie schonmal in der WindowsFileCache geladen und muß danach nicht nochmal von der platte geladen werden

Speichern: wird die WindowsFileCache mitgemessen oder nicht?
- ja: dann dauert es länger, da hier bis da, wo die Daten wirklich auf dem Stick sind, gemessen wird
- nein: in der Cache sind sie schnell, aber dann sind sie noch malne nicht "sicher" auf dem Stick.

das NEIN ist dir bestimmt schonmal aufgefallen.
- datei speichern = ratz fatz fertig (angeblich)
- und dann blinkt der Stick noch ewig ... wärend Windows im Hintergrund die Daten endlich schreibt

[edit]
och menno

Kharlanki 1. Nov 2009 16:19

Re: Dateien auf USB-Stick kopieren
 
Danke fuer den Hinweis auf CopyFileEx!

Aber woran liegt es denn, dass die Varianten 1 und 2 dermassen langsam sind? Weit unterhalb der Uebertragungsgeschwindigkeit von USB. Und so schlecht kann mein Asia-MP3-Player nicht sein. ;)

Wenn CopyFile von Windows gecached wird... Kann ich mir denn sicher sein, dass die Files wenigstens in der Reihenfolge aus dem Cache auf den Stick kopiert werden, in der sie in den Cache kamen?

Mein Asia-MP3-Player listet die Dateien leider in der Reihenfolge auf, in der sie rueber kopiert wurden. Wenn ich per Explorer mehrere Dateien rueberziehe, stimmt also die Trackreihenfolge nicht mehr. Dafuer muesste ich die Dateien schon einzeln rueberziehen. Mein Tool soll mir hier die Arbeit abnehmen.

DeddyH 1. Nov 2009 16:31

Re: Dateien auf USB-Stick kopieren
 
Zitat:

Zitat von Kharlanki
Mein Asia-MP3-Player listet die Dateien leider in der Reihenfolge auf, in der sie rueber kopiert wurden. Wenn ich per Explorer mehrere Dateien rueberziehe, stimmt also die Trackreihenfolge nicht mehr. Dafuer muesste ich die Dateien schon einzeln rueberziehen. Mein Tool soll mir hier die Arbeit abnehmen.

Sei mir nicht böse, aber das klingt nach suboptimalem Design. Für so etwas erstellt man sich doch Playlists oder sortiert die Tracks nach Namen etc.

Kharlanki 1. Nov 2009 16:36

Re: Dateien auf USB-Stick kopieren
 
Zitat:

Zitat von DeddyH
Sei mir nicht böse, aber das klingt nach suboptimalem Design.

Dafuer war er billig... ;) Ausserdem hab ich so was zum Basteln...

DeddyH 1. Nov 2009 16:38

Re: Dateien auf USB-Stick kopieren
 
Ach, das ist ein gekauftes Programm? Ich dachte, das hättest Du selbst geschrieben.

Kharlanki 1. Nov 2009 16:42

Re: Dateien auf USB-Stick kopieren
 
Zitat:

Zitat von DeddyH
Ach, das ist ein gekauftes Programm? Ich dachte, das hättest Du selbst geschrieben.

Aeh, wie jetzt?

Ich habe mir nen guenstigen MP3-Player gekauft, den ich immer dateiweise befuellen muss, da er die Dateien in der Reihenfolge auflistet, in der sie auf den Player kopiert wurden. Da das bei einem Hoerbuch suboptimal ist, will ich mir ein Transfertool schreiben, dass mir eine Queue in der richtigen Reihenfolge nacheinander auf den Player schiebt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz