Progressbar beim kopieren einer großen Datei

  • Hallo,

    ich bräuchte mal wieder einen Denkanstoß. Ich schreibe gerade ein Script, das für mich automatisch die Filme auf meiner Save-Platte mit den Filmen auf meiner ext. Platte am TV abgleicht, neue auf die TV-Platte kopiert und alte Daten löscht oder ersetzt.
    Jetzt ist so ein Film ja in der Regel recht groß.

    Ich bräuchte eine Möglichkeit, für das Kopieren von 1 großen Datei einen Fortschrittsbalken in meiner GUI zu füllen. Ich habe Google schon befragt, aber nur Lösungen zum Kopieren von mehreren Dateien gefunden, bei denen dann die Ordnergröße verglichen wird. Da ich aber nur eine Datei betrachte, geht das nicht, weil hier der Speicherplatz während dem Kopieren nicht ansteigt, sondern erst am Ende von 0 auf den vollen Wert springt (zumindest bei der Funktion mit xcopy, die ich mir geschrieben habe).

    Wie kann ich während dem Kopieren abschätzen, wieviel Prozent der Datei schon kopiert sind und wie viele noch fehlen?

    • Offizieller Beitrag

    Ich habe mal eine Funktion zum kopieren von Dateien mit Progressbar geschrieben: _FileCopyEx
    Damit kannst Du auch einzelne Dateien kopieren.
    Beispiel:

    AutoIt
    Global $aSourceFiles[1] = [@ScriptDir & '\big_buck_bunny_1080p_surround.avi'], $aDestDir[1] = [@ScriptDir & '\temp\']
    Global $sLog = _FileCopyEx($aSourceFiles, $aDestDir, 16 + 8 + 4 + 2 + 1, 'Dateien kopieren...') ; hier erfolgt dann das kopieren
    ConsoleWrite('Fehler: ' & @error & @CR)
    ConsoleWrite('Log: ' & $sLog & @CR)
  • Hallo!

    Ich das selbe Problem mit Robocopy und einer GUI gelöst indem ich den Kopiervorgang als Prozess mit robocopy mache und die Prozentanzeige aus dem Prozess abfrage und dann in einer Gui als Fortschrittsbalken darstelle!

    Ist zwar wie sich mit der linken Hand das rechte Ohr kratzen, aber es funktioniert sehr gut.

    Codeschnippsel:

  • Also Danke schonmal für die Antworten.

    Oscar : schöne Skriptsammlung auf deiner Website übrigens. Ich denke, die beiden Skripte für Widerstände werde ich mir mal zu Gemüte führen ;-). Mir schwebt da schon länger ein Skript im Kopf rum, das für Spannungsteiler die beste Kombination aus erhältlichen Widerstandswerten und den entstandenen Fehler ermittelt (habe bei meinen Elektronikprojekten öfter den Fall, dass ich z.B. 4 verschiedene Referenzspannungen benötige, die ich aus Platzgründen über 1 gemeinsamen Spannungsteiler realisiere).

    Ich habe mit deiner Funktion jetzt mal einen test gemacht, den ich aber leider nicht starten kann. Nachdem ich mir endlich alle Headerdateien zusammengesucht habe, gibt der Compiler einen Fehler aus.

    Headerdatei WinAPIInternals.au3, Zeile 629
    Er hat wohl Probleme diesen Befehl zu verarbeiten

    AutoIt
    Return $bTest ? $vTrue : $vFalse

    genauer gesagt stört er sich an dem ?
    Da ich keine Ahnung habe, was der Autor damit bezwecken wollte, hoffe ich, dass Ihr mir weiter helfen könnt. Liegt es evtl. daran, dass ich nur mit der Lite-Version von Scite arbeite (bin am Arbeitsplatz und konnte damals nur AutoIT mit der Lite-Version installieren).

    Ich werde parallel auch mal versuchen, die Idee von Racer anzupassen und einen Test zu machen.

    2 Mal editiert, zuletzt von Mistil (16. Dezember 2015 um 11:43)

  • Also.

    Gleich Vorweg: Alle Probleme gelöst :D . Vielen Dank an die Helfenden.

    Ich habe zu Hause die Version aktualisiert und die Funktion ließ sich ausführen. Dabei habe ich entdeckt, dass es auch eine entpackbare Version von AutoIT und sogar von Scite gibt. So konnte ich auch ohne entsprechende Rechte die installierte Version auf meinem Firmenrechner aktualisieren und habe jetzt sogar Scite auf dem Rechner (endlich muss ich mich nicht mehr mit dem unterschiedlichen Syntax-Highliting herumschlagen) :party:

    Ich habe nach euren Postings erst mal einen Speedtest mit der standard-Funktion FileCopy als Referenz, xcopy, FileCopyEx und Robocopy durchgeführt. Interessant war dabei, dass FileCopyEx trotz der Mehrarbeit durch das Füllen eines Fortschrittbalkens gut mithalten konnte und bei größeren Dateien sogar um eineiges schneller war (beim Kopieren auf einer Festplatte). Beim kopieren von einer Platte auf die andere (physikalisch, keine Partition) war der Effekt dann leider nicht mehr zu sehen (ich habe die Messergebnisse mal angehängt, falls es jemanden interessiert. Ist eine xlsx, die ich gepackt habe, weil das Forum dieses Format wohl nicht wolte). Kopiert wurden je 20 txt-Dateien, die mit Zahlen von 0-9 gefüllt waren, bis die Dateigröße erreicht war (die Präfixe sind dezimal-basiert, 100kB stehen hier also für 100.000Byte). Der letzte Wert ist ein Mittelwert der gemessenen Zeitenm in s. Den 1. Messwert habe ich dabei ausgelassen.

    Ich habe mich dann auch für die von Oscar erstellte Funktion FileCopyEx entschieden und diese für meine Bedürfnisse etwas umgewandelt. So wird jetzt kein neues Fenster mit Progress-Balken erstellt, sondern ich übergebe der Funktion ein Handle des Balkens, der gefüllt werden soll.

    Das Prgramm ist jetzt soweit fertig und war auch schon im Einsatz :D

    Nochmal Danke für eure Hilfe :thumbup:

  • Nein, das passt so schon ganz gut. Ich war nur überrascht, dass deine Funktion trotz berechnen und aktualisieren des Fortschritt-Balkens so schnell ist im Gegensatz zu den anderen Möglichkeiten (ohne belastung des Prozessors durch einen Fortschrittsbalken) und wollte euch an der Messung teilhaben lassen :D