FileCopyProgress - ähnlich dem Windows eigenen Copy-Window

  • Angeregt durch eine Anfrage im Forum habe ich mal eine FileCopy-Funktion mit GUI erstellt, die alle Infos des Window-Copy vereint: FileCopyProgress

    Aber Bilder sagen mehr als Worte:

    Wie mit FileCopy lassen sich einzelne Dateien oder Ordner kopieren. Die Verwendung von Wildcards ist möglich. Die Syntax ist also an diese Funktion angepasst.

    Zusätzlich können Ausschluss-Attribute übergeben werden, standardmäßig sind das "SH".

    Syntax: _FileCopyProgress($_sSourcePath, $_sDestinationFolder, $_vFlag, $_sAttribExclude)

    Bei einem Fehler wird dieser angezeigt bzw. mit $FC_LOGCOPY in das Log geschrieben. Der Kopiervorgang für evtl. noch zu kopierende Dateien wird danach fortgesetzt.

    Die Copy-Flags sind identisch zur FileCopy-Funktion. Aber es gibt auch zwei neue!

    $FC_LOGCOPY, erstellt eine Datei "TARGET\FOLDER\progresscopy.log", überschreibt evtl. vorhandene ältere Logdateien

    $FC_OPENLOG, ! setzt automatisch das $FC_LOGCOPY Flag ! - Öffnet die Logdatei (wenn erstellt) nach Beendigung des Kopiervorganges

    Code: Bsp. Log
    [2022-09-02 09:51:31] Start Copy "C:\VM_SHARE\*.GDB" --> "C:\CODE\Test"
    Anzahl Dateien: 5
    Gesamtgröße: 6.0 GB
    [SUCCESS] C:\CODE\Test\GDI.GDB                                                  1.2 GB
    [SUCCESS] C:\CODE\Test\GDI_ORIG_2021_12_08.GDB                                  1.2 GB
    [ERROR]   C:\CODE\Test\GDI_ORIG_2022_01_10.GDB                                  Die Datei ist bereits vorhanden.
    [SUCCESS] C:\CODE\Test\GDI_ORIG_2022_02_28.GDB                                  1.2 GB
    [ERROR]   C:\CODE\Test\GDI_ORIG_2022_08_03.GDB                                  Die Datei ist bereits vorhanden.
    [2022-09-02 09:52:15] End Copy

    ABER:

    Irgendwo hat sich ein Fehler versteckt. Das Kopieren funktioniert tadellos, die Anzeige Restzeit, Restdateien, Fortschritt stimmt zum Ende hin jedoch nicht.

    Hab ich vielleicht einen Denkfehler drin? Das passiert in der Funktion "_ProgressSetCopyData", Zeile 239.

    Zum Testen braucht man aber große Dateien (> 1 GB), sonst geht alles zu schnell.

    Bin für eure Hilfe dankbar. Erledigt, s. Post #2

  • Fehler behoben!

    Ich hatte mir selbst ein Ei gelegt. Die Berechnung der Gesamtgröße aller Dateien hatte ich in einer Schleife mit der Prüfung auf Exclude-Attribute vereint. Aber falsch angeordnet, sodass die Dateigröße bei jedem Attribut ermittelt wurde: 2 Attribute = doppelte Größe. :Face:

    Die Korrektur der Anzeige direkt nach Feststellung vorhandener Datei im $FC_NOOVERWRITE fehlte auch, das brachte dann falsche Restzahl und -Zeit.

    Nun ist es m.M. nach OK. Korrigiert im Startpost. Aber falls ihr noch Fehelr findet - bitte melden.

  • Hallo BugFix. Ich möchte gerne dein Script in meines integrieren. Aber ich bekomms nicht vernünftig zum Laufen.

    Mein eigener Code stellt mir ein 2D Array zusammen:

    AutoIt
    Global $aDateien[1][3]
    ;dann mit _ArrayAdd() das Array befüllen und den index immer um +1 erweitern
    ; $aDateien[0][0] = 22
    ; $aDateien[$i][0] = Quelldatei
    ; $aDateien[$i][1] = Zieldatei mit neuem Namen
    ; $aDateien[$i][2] = Filezise(von der Quelldatei)

    Das Array ist in Ordnung und funktioniert in der GUI-Darstellung (per ListView, um zu sehen was da ist und wie es danach sein wird).

    Ich habe viele Versuche unternommen um das Array an deine Funktion zu übergeben. 1x hat es tatsächlich irgendwas gebracht und der Fortschrittsbalken hat sich bewegt. Dann ist irgendwas gewesen und brach ab. Beim Versuch, den "Fehler" auszumerzen hab ich dann beinahe alles zerschossen.

    Hab dann den Versuch unternommen aus meinem 2D Array 2 einzelne zu machen. Eines mit den Quelldateien, die ich dann vorher bereits umbenenne, damit das Problem mit den verschiedenen Namen aus der Welt geschafft ist.

    Das 2. Array ist mit den entsprechenden Zielordnern gefüllt. (Die Ziele können verschieden sein)

    Danach versuchte ich dein Script in meinem nachzubauen. Es funktioniert zumindest das Kopieren, aber die Infos beim Kopiervorgang... mir raucht die Birne... Also meine Frage:


    Wie muss man ein Array an deine Funktion übergeben, damit es funktioniert?