![]() |
ProgressBar beim Kopieren von Dateien - Falsche Prozente
Hallo,
ich verwende in einem Programm beim Kopieren von Daten zwei ProgressBars. Die erste für die aktuelle Datei und die zweite für den gesamten Fortschritt. Das Kopieren stellt kein Problem dar, jedoch die Anzeige der zweiten ProgressBar. Für den Fortschritt der ersten ProgressBar verwende ich die Dateigröße, demnach weise ich PBr1.Max die Dateigröße zu. Da ich nun nicht nur eine Datei sondern größere Mengen kopieren will, kann ich die Gesamtgröße aller Dateien nicht für PBr2.Max verwenden da es den Integerbereich verlässt. Aus diesem Grund dachte ich, dass ich für die zweite die Prozente ausgebe. Demnach hat PBr2.Max immer 100. Leider schaffe ich es nicht, die Prozente so zu errechnen, dass die ProgressBar am Ende passt.
Delphi-Quellcode:
// PBrCopy = einzelne Datei
// PBrCopyAll = Gesamtfortschritt // FullSize = Gesamtgröße aller Dateien // nachdem Kopiervorgang für einzelne Datei beendet // Codevariante 1 - Gesamtfortschritt zu früh am Ende PBrCopy.Max := Trunc(0.5 + 100.0 * PBrCopy.Max / FullSize); PBrCopyAll.Position := PBrCopyAll.Position + PBrCopy.Max; // Codevariante 2 - Gesamtfortschritt zu früh am Ende, jedoch weniger früher PBrCopy.Max := Round(PBrCopy.Max * 100 / FullSize); PBrCopyAll.Position := PBrCopyAll.Position + PBrCopy.Max; |
Re: ProgressBar beim Kopieren von Daten - Falsche Prozente
Wieso gibst Du nicht als ProgressBar.Max die Anzahl der Dateien an und erhöhst nach jeder Datei die Position um 1?
|
Re: ProgressBar beim Kopieren von Daten - Falsche Prozente
Angenommen du kopierst 2 Dateien. Eine ist 130 MB und die andere ist 3,4 MB. Das würde bedeuten, dass nach dem 1. Kopieren die ProgressBar in der MItte ist, müsste aber datenmäßig ganz nah am Ende sitzen.
|
Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
Naja, eine bessere Lösung fällt mir auch nicht ein. Außerdem macht Windows das ja auch nicht besser, wenn man sich die errechneten Zeiten beim Kopieren mit dem Explorer einmal ansieht (ich hatte schon eine errechnete Zeit von ca. 120 Jahren Restdauer). :mrgreen:
|
Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
Wenn sich keine andere Lösung findet, werde ich das wohl so machen wie du vorgeschlagen hast, da die meisten Dateien die ich kopiere nicht so große Schwankungen unterliegen und die Anzahl der zu kopierenden Dateien meist auch größer als 30 ist. Aber eine schönere Lösung wär mir lieber ;).
|
Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
Hallo!
Solltest Du die Dateien mit ReadBuffer / WriteBuffer kopieren, dann errechne am Anfang die Gesamtgröße aller Dateien (machst Du wahrscheinlich ja schon). Vor dem kopieren einer neuen Dateien PBCopy.Max auf Dateigröße setzen, nach jedem Schleifendurchlauf die Größe der tatsächlich [Am Ende wird ja meistens ein kleinerer Wert geschrieben] geschriebenen Datenmenge auf PBCopy.Position dazuaddieren. Bei der nächsten Datei Position wieder auf 0 setzen und von vorne beginnen... Bei der PBCopyAll einfach als Max-Wert die Gesamtgröße aller Dateien festsetzen und weiter wie oben (Natürlich ohne bei der nächsten Datei die Position zurückzusetzen). Die ProgressBars unterscheiden sich also dann lediglich beim Maximum. Damit würden dann auch Deine Berechnungen wegfallen... Hab ich auch schon öfters so gemacht, funktioniert bei mir einwandfrei! SCRaT |
Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
Das funktioniert vieleicht bei kleinen Datenmengen nicht aber bei Dateien mit einer Gesamtgröße von mehreren 100 MB. Um eine genaue Fortschrittsanzeige zu haben würde ich die Byte zur Berechnung nutzen und das würde weit den Integerbereich verlassen
|
Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
Zitat:
SCRaT //EDIT: Wertebereich INT64 eingefügt. |
Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
Doch Int64 reicht für meine Bedürfnisse für eine einzelne Datei und zum Errechnen der Gesamtgröße aus aber ProgressBar.Max ist leider nur Integer.
Aber als ich vorhin den Text geschrieben habe, viel mir auch ein ich, dass ich das in KByte umrechnen könnte. |
Re: ProgressBar beim Kopieren von Dateien - Falsche Prozente
Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaube ich habe das Problem gefunden. Es scheint als ob meine Kopierrountine einen Fehler tätigt. Ich habe probeweise alle Dateigrößen, die übertragen wurden in einer ListBox eingeschrieben. Das unfassbare war, dass ich nicht wie ich dachte 25 Dateien sondern 28 Dateien kopiert haben, zumindest virtuell. Kopiert wurden aber wirklich nur 25, aber in der Liste stehen 28 Werte. Einige Werte sind nahezu identisch und unterscheiden sich blos um ein paar Byte. Was ich damit sagen will ist, dass die folgende Routine rigendwie doppelte Werte aufnimmt.
Delphi-Quellcode:
Wie kann das sein? Dazu ein Bild im Anhang.
function CopyFileProgress(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile, lpData: DWORD): DWORD; stdcall;
begin Application.ProcessMessages; if Main.bCopyCanceled = True then begin Result := PROGRESS_CANCEL; Exit; end; case dwCallbackReason of CALLBACK_CHUNK_FINISHED: begin Progress.PBrCopy.Position := TotalBytesTransferred.QuadPart; Result := PROGRESS_CONTINUE; end; CALLBACK_STREAM_SWITCH: begin Progress.PBrCopyAll.Position := Progress.PBrCopyAll.Position + Progress.PBrCopy.Position; Progress.ListBox1.Items.Add(inttostr(Progress.PBrCopy.Position)); Progress.PBrCopy.Max := TotalFileSize.QuadPart; Result := PROGRESS_CONTINUE; end; end; end; [Edit] Ich habe dazu mal ein anderen Beitrag eröffnet, da es meiner Meinung nach nicht hier her passt. ![]() [/Edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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