Ordner/Dateien verpacken mit Progressbar

  • Hi @all

    Beschäftige mich seit langem mal wieder mit AutoIt und möchte eine Backup Funktion in ein Programm einbauen. Die soll "lediglich" ein paar Ordner/Dateien mit Progressbar in ein Archiv packen, welches sich möglichst mit Windows Bordmitteln entpacken lässt. Hab schon ein paar Bsp. gefunden, die entweder nicht funktioniert haben, oder sich nicht wie gewünscht integrieren lassen. Hat jmd. ne Idee nach was man so suchen kann? Danke im Voraus!

  • Hallo @dieselwiesel !

    Ich gehe mal davon aus, dass Du keine Progressbar im Stil 'marquee' (also das Zylonenauge) möchtest.

    Ich habe mir für eine ähnliche Anforderung mal eine sehr einfache Lösung erstellt.

    Das GUIElement wird erstellt über :
    $idProgressbar = GUICtrlCreateProgress(10, 200, 500, 35) - Positionswerte bei Bedarf anpassen

    Du kannst in einer Progressbar die Schrittweite angeben. Start ist bei 0, also 'leer'.

    Voraussetzung für mein Beispiel ist, dass Du die Anzahl der Schritte vorher definiert hast (z.B. 10).
    $iProgressStepMax = Max. Anzahl der Schritte

    $iProgressStepCount = Aktueller Schritt

    Nachdem der erste Schritt (z.B. das Kopieren eines Verzeichnisses) beendet ist, erhöhst Du den Schrittzähler um 1, und zeigst den neuen Zustand der Progressbar an :
    $iProgressValue = Round ( (100/$iProgressStepMax) * $iProgressStepCount)

    GUICtrlSetData($idProgressbar, $iProgressValue)
    $iProgressStepCount = $iProgressStepCount + 1
    usw.

    Leider muss ich jetzt zu meiner Skatrunde.
    Ich bin sicher, dass @alpines, @BugFix, @Bitnugger u. A. wesentlich bessere Beispiele liefern werden, oder, während ich hier schreibe, bereits geliefert haben :) .
    Falls Du trotzdem noch genauere Infos zu meiner Variante benötigst, dann melde Dich ruhig.

    Gruß Musahi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Nachdem der erste Schritt (z.B. das Kopieren eines Verzeichnisses) beendet ist, erhöhst Du den Schrittzähler um 1, und zeigst den neuen Zustand der Progressbar an :

    Das kann bei großen Verzeichnissen den Eindruck erwecken, dass das Programm eingefroren ist.
    Besser wäre es, wenn man nach jeder Datei die ProgressBar aktualisiert. Da muss man auch nicht eine Schrittweite oder ähnliches definieren sondern nimmt einfach die Anzahl der verarbeiteten Dateien geteilt durch die Anzahl aller Dateien.

  • Oder so...

    _CopyWhithProgress

    _CopyWhithProgress.png

    Einmal editiert, zuletzt von Bitnugger (12. Mai 2017 um 21:06)

  • Danke erstmal für Eure Antworten!!!

    Ich habe ein Bsp. von UEZ gefunden, dass eigentlich recht gut funktioniert u. auch den Zweck erfüllt

    Spoiler anzeigen

    Allerdings hab ich noch ein Problem damit die Anzahl der Dateien für $iMax zu ermitteln, da ich nur 5 von 6 Ordnern sichern möchte. Dachte an _FileListToArrayRec() weil ich den einen Ordner übers Exclude auslassen kann, aber das liefert mir rund 250 Dateien weniger als es wirklich sind.

    Spoiler anzeigen

    Irgendwelche Vorschläge?

  • So schauts jetzt aus, funktioniert auch...

    Spoiler anzeigen

    Verbesserungsvorschläge are welcome :thumbup:

  • Local $sFolder = _FileListToArrayRec("c:\myprog", "*1;*2;*3;*4;*5||6", 2, 0, 1, 2)

    Wenn du bei $sMask die Verzeichnisse mit Include explizit angibst, ist es nicht nötig, ein Verzeichnis auf selber Ebene mit Exclude_Folders auszuschließen - sondern nur bei einem Unterverzeichnis innerhalb der Include.
    Local $sFolder = _FileListToArrayRec("c:\myprog", "*1;*2;*3;*4;*5", 2, 0, 1, 2)

    Sträflich ist jedoch: Du überprüfst gar nicht, ob 7z.exe einen Fehler meldet!

    Hier mal eine etwas optimierte Version für dich...

    _SevenZipAdd

    3 Mal editiert, zuletzt von Bitnugger (14. Mai 2017 um 02:45)

  • Ja, das Errorhandling und ich werden keine Freunde mehr :D Ich werd das von dir mal ausprobieren. Der -spf Befehl ist in dem 7z bei mir gar nicht gelistet und der packt dann auch "komisch" zusammen ?(

  • Der -spf Befehl ist in dem 7z bei mir gar nicht gelistet und der packt dann auch "komisch" zusammen.

    Hallo @dieselwiesel !

    Mit dem '-spf' Switch wird der komplette Dateipfad inklusive Laufwerksbuchstabe im Archiv gespeichert, also der absolute Pfad, nicht der relative Pfad. Wenn Du die Zip-Datei per Doppelklick öffnest, dann fängt die Dateiliste mit dem Laufwerksbuchstaben an, also z.B. C:. Sieht etwas ungewohnt aus, vermeidet aber mögliche Probleme mit 'duplicate names'.
    Ggf. kann man den Switch einfach weglassen, aber das soll @Bitnugger beurteilen.

    Wenn '-spf' bei Dir nicht als Parameter aufgeführt ist, dann prüfe mal Deine Version von 7-Zip.
    Der Switch '-spf' wurde lt. Changelog in Version 9.25 alpha (Sept. 2011) eingeführt.
    Eventuell nutzt Du die ältere Version 9.20 (von 2010) - die ist immer noch recht verbreitet.

    Aktuelle Version (stable) = 7-Zip 16.04 (04.10.2016) :
    Beim Download von der 7-Zip Website den Link :
    x86/x64 -> 7-Zip Extra: standalone console version, 7z DLL, Plugin for Far Manager
    wählen.

    Ich verwende die Variante 7za.exe (a=alone), also die 'standalone' Version von 7-Zip. Sie unterstützt zwar weniger Formate (7z, lzma, cab, zip, gzip, bzip2 und tar), benötigt dafür aber keine externen DLLs.
    Das Kommandozeileninterface von 7za.exe und 7z.exe sind identisch.

    @Bitnugger : Auch von mir ein Danke für das elegante Beispiel.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (15. Mai 2017 um 00:08)

  • Ja, das mit den absoluten Pfaden meinte ich mit komisch. Hab die 9.38 beta im Einsatz. Nutze sonst eig. WinRAR, aber ZIP Dateien kann man mit Windows Bordmitteln entpacken.

    Das mit der 7za.exe ist ne sehr gute Idee, aber für was sind dann die 7za.dll und 7zxa.dll dabei? Gibts eigentlich auch nen Switch bei 7z das er keine Dateien überschreibt, wenn sie schon existieren?

    Grad mal 7za.exe getestet, ist von der Niceigkeit her besser wie 7z.exe, da es bereits Informationen liefert, die vorher abgefragt werden müssen wie z.B. Anzahl der Dateien u. Ordner, es liefert auch eine Prozentangabe, die man evtl. über StdoutRead abfragen u. in eine Progressbar setzen kann?!


    Einmal editiert, zuletzt von dieselwiesel (15. Mai 2017 um 13:10)

  • ist von der Niceigkeit her besser

    Was?

    über StdoutRead abfragen u. in eine Progressbar setzen kann?!

    Ja das kannst du so machen. Ich persönlich hatte oft Probleme den Stdout von Programmen zu lesen und habe es immer über einen Umweg gemacht:

    Du startest das Programm einfach über die CMD und lässt die Ausgabe in eine Datei schreiben, in etwa so:
    RunWait(@ComSpec & " /c ""program.exe -param1 -param2 >> out.txt""")

    Bei der Methode musst du aber auf das Working-Directory aufpassen, weil die out.txt Datei dort hingeschrieben wird.

  • Gibts eigentlich auch nen Switch bei 7z das er keine Dateien überschreibt, wenn sie schon existieren?

    Man unterscheidet zwischen 'commands' und 'switches'.
    'commands' sind z.B. :
    a für archivieren
    x für extrahieren
    'switches' gibt es reichlich, zum Teil auch kombinierbar.

    -ao (Overwrite mode) Switch :
    Legt fest, wie beim Extrahieren mit Dateien verfahren wird, die bereits auf der Festplatte existieren :
    -aoa überschreibt alle Dateien
    -aos überspringt das Extrahieren bereits bestehender Dateien
    -aou automatische Umbennenung der Datei im Archiv (datei.txt -> datei_1.txt)
    -aot automatische Umbennenung der Datei auf der Festplatte

    In deinem Fall (kein Überschreiben bestehender Dateien) also : 7za x datei.zip -aos
    Nützlich ist beim Extrahieren auch der switch -y. Dieser unterdrückt alle Abfragen, ob z.B. überschrieben werden soll.
    Auf der 7-Zip Website habe ich auf die Schnelle keine Liste aller Parameter gefunden. Sollte aber mit Hilfe der Suchmaschine des Vertrauens kein Problem sein. Einen direkten Link zu der Quelle die ich verwende, möchte ich hier wg. Forenetikette nicht angeben. Schreibe mir eine PN.

    Zum Thema 7za.dll :
    Wenn Du den 7-Zip Download entpackst, dann findest Du eine 'readme.txt'. Dort wird, wenn auch nicht gerade superverständlich, beschrieben, welche einzelnen Komponenten enthalten sind.
    Auszug : "7za.dll and 7zxa.dll arbeiten via COM Interface."

    Du benötigst nur die 7za.exe !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • @alpines

    ist von der Niceigkeit her besser

    Was?

    Ich vermute mal, 'Niceigkeit' ist ein etwas verunglückter Anglizismus für Benutzerfreundlichkeit, abgeleitet von 'nice' für nett :) .


    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Von der "Niceigkeit" her deshalb besser, weil 7za.exe mehr Infos liefert als die herkömmliche 7z.exe. Somit kann man sich doch ein paar "extra" Wege sparen - wenn ich von meinem Bsp. ausgehe ;)

  • Schon klar, aber der Begriff.... bähh...

    Nimm das Leben nicht so schwer, lutsch lieber einen Gummibär ;) Der ist vong der Tastigkeit her lecker am been :D

    Zitat

    Du startest das Programm einfach über die CMD und lässt die Ausgabe in eine Datei schreiben, in etwa so:
    RunWait(@ComSpec & " /c ""program.exe -param1 -param2 >> out.txt""")

    Bei der Methode musst du aber auf das Working-Directory aufpassen, weil die out.txt Datei dort hingeschrieben wird.

    D.h. es wird zu jeder Datei die out.txt neu erstellt u. das Script holt sich die Infos aus der out.txt und zeigt sie an? Hast du da evtl. ein kleines Bsp. dazu?

  • Jede Methode hat ihre eigenen Fallen... ein Umweg ist allerdings immer nur ein Umweg - und niemals eine Verbesserung/Erleichterung.

    Mit einer Ausgabeumleitung in eine Datei schreibst du doch lediglich den Stdout in eine Datei - den du mit StdoutRead direkt in eine AutoIt-Variable kopieren kannst!

    Vorteile von StdoutRead:

    • Du brauchst du dich nicht mit einer zusätzlichen Datei rumschlagen, aus der du die Daten dann erst noch einlesen musst.
    • Du hast keine Dateien, die du entsorgen musst.

    Nachteile von StdoutRead:

    • Keine


    Wenn du es so machst, brauchst du das Working-Directory nicht unbedingt setzen...

    RunWait(@ComSpec & ' /c "program mit spaces im name.exe" -param1 -param2 > "f:\Umwege 2\out.txt"')

    ">>" Die aktuelle Ausgabe wird an das Ende einer bestehenden Datei angehangen.
    ">" Die aktuelle Ausgabe wird in eine vorhandene Datei geschrieben, bereits vorhandener Inhalt wird dabei überschrieben.

    In beiden Fällen gilt: Falls die Datei nicht existiert, wird eine neue Datei erzeugt.

  • @dieselwiesel (ggf. auch für Andere interessant)

    7-Zip : Übersicht zu den Kommandozeilenoptionen der Konsolenvariante

    Wie ich oben bereits beschrieben habe, kann man sich die standalone Variante von der 7-Zip Website unter folgendem Link herunterladen :
    x86/x64 -> 7-Zip Extra: standalone console version
    -> Entpacken. Die Datei '7za.exe' ist völlig ausreichend - sie kann an eine beliebige Stelle kopiert werden. Die DLLs etc. benötigt man im Normalfall nicht. Leider ist in dieser Zusammenstellung die offizielle Hilfedatei nicht enthalten (aktuelle Version : 16.04 vom 04.10.2016).

    Um trotzdem an die Hilfe zu kommen, beim Download folgenden Link wählen :
    32-bit x86 -> 7-Zip für 32-bit Windows (64-Bit geht auch)
    Man erhält die Datei '7z1604.exe', also die Installationsvariante mit GUI etc.

    Wichtig :
    '7z1604.exe' NICHT STARTEN, sondern mit '7za.exe' entpacken. Unter den Dateien findet man jetzt die Hilfe '7-zip.chm'. Hilfe öffnen, und den Punkt 'User's Guide for command line version' wählen. Dieser enthält genaue Infos zu den verfügbaren Kommandos und Schaltern.
    Ich hätte die Datei natürlich auch einfach hier anhängen können, aber dass ist lizenzrechtlich ggf. nicht zulässig.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (15. Mai 2017 um 17:32)