![]() |
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:
Variante 2:
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;
Delphi-Quellcode:
Variante 3 ist CopyFile().
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); 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] |
Re: Dateien auf USB-Stick kopieren
|
Re: Dateien auf USB-Stick kopieren
Schau dir bitte mal CopyFileEx() an
Code:
Implementiere einfach eine Funktion die du als lpProgressRoutine-Parameter übergibts!
BOOL CopyFileEx(
LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, LPBOOL pbCancel, DWORD dwCopyFlags ); MfG |
Re: Dateien auf USB-Stick kopieren
Was deine Zeitmessungen angeht: Das kannst du nicht vergleichen, weil Windows die Zugriffe cached.
@Aphton: Zu langsam. :tongue: |
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 |
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. |
Re: Dateien auf USB-Stick kopieren
Zitat:
|
Re: Dateien auf USB-Stick kopieren
Zitat:
|
Re: Dateien auf USB-Stick kopieren
Ach, das ist ein gekauftes Programm? Ich dachte, das hättest Du selbst geschrieben.
|
Re: Dateien auf USB-Stick kopieren
Zitat:
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 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz