_Crypt_DecryptFile - Eine sich aktualisierende Progressbar dazu

  • Hi,

    Ich hab ein Problem. Ich möchte eine vorher verschlüsselte Datei mit _Crypt_DecryptFile() Entpacken.

    Ich habe es jetzt so gemacht, dass ich mit AdlibRegister() eine Fuktion alle 100 ms aufgerufe, die die Grösse der bereits entschlüsselten Datei auslist, davon die Prozentzahl berechnet und den Fortschrischbalken aktualisiert. Allerdings funktioniert das nicht. :( (Der Fehler lieg an dem FilegetSize() )

    Es tut mir leid, dass ich jetzt kein Code-Beispiel liefere, aber ich habe diesen Teil bei meinen Versuchen bereitsch gelöscht und ich will jetzt nicht wieder etwas schreiben, dass nicht funktioniert... :)
    Ich hoffe, ich habe es genung beschrieben aber wenn ihr den Code braucht, werde ich ihn natürlich neu schreiben... :wacko:

    Wenn jemand eine Idee hat wäre ich froh. Es muss auch nicht mit der Funktion "_Crypt_DecryptFile()" sein. Ich möchte einfach die Datei mit einem Passwort veschlüsseln können und beim entpacken eine Progressbar anzeigen können. Bitte keine Vorschläge mit der Zip-au3 :)

    Es gibt trozdem ein kleines Beispiel:

    [autoit]


    Func Entpacken()
    ; Progressbar erstellen
    Adlibregister("fortschritt", 100)
    ; Entpacken
    Adlibunregister("fortschritt")
    endFunc

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

    Func fortschritt()
    filegetsize($die_gerade_am_Entpackende_Datei) ; Hier liegt der Fehler
    ; Daraus den Vortschritt berechnen und die Progressbar aktualisierten
    endFunc

    [/autoit]

    Einmal editiert, zuletzt von dada (27. Juni 2011 um 19:43)

  • Hallo dada,

    das kann nicht funktionieren, da je nach FileTyp, gewählten Schlüssel etc. die Zeiten stark differieren. Du kannst höchsetns eine immer durchlaufende Progresbar anzeigen, damit der User erkennt das Programm ist beschäftigt:

    Spoiler anzeigen
    Spoiler anzeigen

    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <ProgressConstants.au3>


    $Form1 = GUICreate("Form1", 545, 125, 5, 5);, $WS_POPUP, $WS_EX_TOOLWINDOW)
    $Button1 = GUICtrlCreateButton('&STOP Marquee', 5, 5, 200)
    $Progress1 = GUICtrlCreateProgress(0, 95, 545, 25, $PBS_MARQUEE)
    $hProgress = GUICtrlGetHandle($Progress1)
    _SendMessage($hProgress, $PBM_SETMARQUEE, True, 10)
    GUISetState(@SW_SHOW)

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button1
    If GUICtrlRead($Button1) = '&STOP Marquee' Then
    _SendMessage($hProgress, $PBM_SETMARQUEE, False, 10)
    GUICtrlSetData($Button1, '&Resume Marquee')
    Else
    _SendMessage($hProgress, $PBM_SETMARQUEE, True, 10)
    GUICtrlSetData($Button1, '&STOP Marquee')
    EndIf
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd


    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>

    Opt('MustDeclareVars', 1)

    Example()

    Func Example()
    Opt("GUIOnEventMode", 0)
    Local $progressbar1, $progressbar2, $button, $wait, $s, $msg, $m

    GUICreate("My GUI Progressbar", 220, 100, 100, 200)
    $progressbar1 = GUICtrlCreateProgress(10, 10, 200, 20)
    GUICtrlSetColor(-1, 32250); not working with Windows XP Style
    $progressbar2 = GUICtrlCreateProgress(10, 40, 200, 20, $PBS_MARQUEE);;Zeile ist gegenüber Original geändert
    $button = GUICtrlCreateButton("Start", 75, 70, 70, 20)
    GUISetState()

    $wait = 20; wait 20ms for next progressstep
    $s = 0; progressbar-saveposition
    Do
    $msg = GUIGetMsg()
    If $msg = $button Then
    GUICtrlSetData($button, "Stop")
    For $i = $s To 100
    If GUICtrlRead($progressbar1) = 50 Then MsgBox(0, "Info", "The half is done...", 1)
    $m = GUIGetMsg()

    If $m = -3 Then ExitLoop

    If $m = $button Then
    GUICtrlSetData($button, "Next")
    $s = $i;save the current bar-position to $s
    ExitLoop
    Else
    $s = 0
    GUICtrlSetData($progressbar1, $i)
    GUICtrlSetData($progressbar2, 1) ;Zeile ist nötig und gegenüber Original geändert
    Sleep($wait)
    EndIf
    Next
    If $i > 100 Then
    ; $s=0
    GUICtrlSetData($button, "Start")
    EndIf
    EndIf
    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    mfg autoBert

  • Danke autoBert,

    dass das mit den Zeiten nicht funktionieren würde, ist mir schon klaar... :)

    Ich wollte es ja so wie bei einem Download machen.
    - Zuerst die Grösse der entpackten Datei ermitteln
    - Die Entpackung starten
    - Vortlaufend die bereits entpackte Grösse messen und mit der Soll-Grösse vergleichen und daraus eine Prozentzahl errechnen

    Aber das funktioniet nicht... Ich glaube es liegt daran, dass er die Datei im Arbeitsspeicher entpackt und erst am Schluss die ganze Datei auf einmal ausspuckt... :)

    Aber deine Idee ist gut und ich werde es jetzt mal mit einer fortlaufenden Progressbar oder etwas ähnlichem arbeiten...

    Lg David