(Ent-)Packen mit Fortschrittsanzeige

  • Hallo zusammen!

    Ich habe AutoIt schon vor einem Jahr entdeckt und mir hier im Forum immer wieder Anregungen geholt. Jetzt hab ich aber ein Problem, zu dem ich nichts finden konnte. Somit musste ich mich doch auch mal registrieren (benutze AutoIt nur "beruflich", zu Hause hab ich Linux).

    Ich habe ein Verwaltungsprogramm für virtuelle Maschinen geschrieben und bin dabei, dieses abzuändern. Ich möchte die Dateien in einem passwortgeschützten, gepackten Archiv speichern, um den Zugriff auf befugte Personen, die das Passwort kennen, zu beschränken. Dazu verwende ich die Konsolenversion von 7z, 7za. Packen und Entpacken ist alles kein Problem. Aber da es sich um Dateien von bis zu 2,5 GB handelt, dauert das (Ent-)Packen schon eine Weile und ich muss den Nutzern den Fortschritt anzeigen. Bei größeren Dateien zeigt 7za den Fortschritt in Prozent in der Konsole ja auch an. Jetzt dachte ich, ich lese einfach mit StdoutRead() die Ausgabe, extrahiere daraus die Prozentangabe und geb sie weiter an ProgressSet. Leider funtioniert das aber nicht, da ich von StdoutRead erst etwas zurück bekomme, wenn 7za fertig ist.

    Spoiler anzeigen
    [autoit]


    $PID = Run(@ComSpec & " /c 7za x ./../VM-Systeme.7z -o" & $Dir & " " & $File & " -r -aoa", "", @SW_HIDE, 2)
    _DebugOut(@error)
    _DebugOut("PID = " & $PID)
    $count = 0
    Do
    $count += 1
    Until StdOutRead($PID, 0, True) <> 0
    $Stdout = StdoutRead($PID)
    $err = @error
    _DebugOut("Stdout = " & $Stdout)
    _DebugOut("Error = " & $err)

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Hat jemand eine Idee, wie ich an die Fortschrittsangaben komme? Zur Not kann ich natürlich auch die Konsole anzeigen lassen, oder die Oberfläche von 7z. Aber es wäre schöner, wenn das Ganze eine einheitliche AutoIt-GUI wäre.


    saja

    Einmal editiert, zuletzt von saja (25. Februar 2009 um 08:06)

  • Hallo,
    du könntest die Größe der entpackten Verzeichnisse abfragen. Da es bei der Fortschrittanzeige ja nur darum geht anzuzeigen, daß der Rechner nicht eingeschlafen ist, wäre das hinreichend genau.
    Also Start des Zippers mit Run oder Shellexecute, danach dann z.B. einmal pro Sekunde den Fortschrittbalken updaten.
    ciao
    .Andy
    Edit: einen Link gibts auch noch ^^

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (20. Februar 2009 um 08:34)

  • Hallo Andy,

    das wäre schon einmal ein Ansatz fürs Entpacken. Danke!

    Aber beim Packen funtioniert das wohl eher nicht, außer das Archiv wächst mit dem Packen kontinuierlich mit. Das muss ich mal überprüfen.

    saja

  • Hallo saja,
    du weisst im Grossen und Ganzen ja vorher ungefähr, welche Daten gepackt werden und auch in etwa die Dateigröße der *.zip. Daher würde ich beim Packen genauso verfahren wie beim auspacken. Wie gesagt, es soll ja nur angezeigt werden daß irgendetwas passiert.
    ciao
    .Andy

  • Hallo Andy

    Ich füge die Dateien zu einem bestehenden Archiv hinzu und habe noch nicht überprüft, ob das beim Packen kontinuierlich mitwächst. Aber mir fällt gerade ein, dass 7za ein temporäres Archiv erstellt und das dann in das orginale Archiv kopiert. Ich könnte also das temporäre Archiv auf die Dateigröße überprüfen.

    Es wäre aber immer noch schöner, die genaue Fortschrittsangaben von 7za zu verwenden. Die zu enpackenden Dateien können eben von 1,3 bis 2,5 GB haben, da wird es doch etwas ungenau...

    saja

  • Hab ich auch schon gehofft, dass mir das was hilft. Da die Hilfe aber dazu sagt:

    Spoiler anzeigen

    -so (write data to stdout) switch
    Causes 7-Zip to write output data to stdout (standard output stream).

    Syntax
    -so

    Examples
    7z x archive.gz -so > Doc.txt

    decompresses archive.gz archive to output stream and then redirects that stream to Doc.txt file.

    7z a dummy -tgzip -so Doc.txt > archive.gz

    compresses the Doc.txt file to the 7-Zip standard output stream and writes that stream to archive.gz file.

    schreibe ich damit die ent-/gepackte Datei auf Stdout. Und das ist nicht das, was ich will. Die Rückgabe, die 7za auf die Konsole schreibt, bekomme ich ja mit StdoutRead. Nur eben leider erst, wenn das (Ent-)Packen bereits fertig ist.

    saja

    Edit: neue Idee:

    Ich versuch's mal mit WinGetText, um von der Konsole zu lesen. Damit sollte ich die aktuelle Prozentangabe von 7za lesen können.

    Danke schon mal für die Vorschläge!

    Edit2: Funktioniert leider nicht. WinGetText scheint von der Konsole nicht lesen zu können. Ich bekomme nur einen leeren String zurück.

    3 Mal editiert, zuletzt von saja (20. Februar 2009 um 10:24)

  • Super, vielen Dank! :thumbup:

    Bin dieses Mal gar nicht drauf gekommen, im englischen Forum zu suchen. Hab inzwischen auch den switch gefunden, um die Dateigröße von Dateien im Archiv herauszubekommen. Damit hätte ich es vermutlich hinbekommen, aber so ist es natürlich viel bequemer. :D

    saja