!Mehrere! Datein per FTP-Downloaden mit Progressbar

  • Hallo zusammen,

    brauche von euch Unterstützung mit meiner Progressbar zum FTP Up-und Download.
    Grundsätzlich funktioniert das Ganze mit dem letzten Parameter, wie auch in der Hilfe beschrieben (Beispiel mit _UpdateProgress)

    Jedoch sind alle beispiele die ich finden konnte immer nur mit einer Datei die vom FTP gezogen werden ich habe n Dateien die gezogen werden sollen. Wie kann ich das in einer Progressbar abbilden?

    [autoit]


    Global $idProgress = GUICtrlCreateProgress(0, 615, 950,5)

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

    ...

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

    _FTP_ProgressDownload($hConn, $MainPath & "\LOG\PROFILE_INDEX.ini", "/TCFTP/PROFILE_INDEX.ini", "_UpdateProgress")
    _FTP_ProgressDownload($hConn, $MainPath & "\CODE\config.ini", "/TCFTP/config.ini", "_UpdateProgress")
    _FTP_ProgressDownload($hConn, $MainPath & "\CODE\connection.ini", "/TCFTP/connection.ini", "_UpdateProgress")

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

    ...

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

    Func _UpdateProgress($percent)
    GUICtrlSetData($idProgress, $percent)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Return -1 ; _FTP_DownloadProgress Aborts with -1, so you can exit you app afterwards
    EndSwitch
    Return 1 ; Otherwise contine Download
    EndFunc ;==>_UpdateProgress

    [/autoit]

    Vielen Dank für eure Hilfe!

  • Hi,

    Möchtest du jedes mal eine neue ProgressBar für eine neue Datei erstellen, oder eine ProgressBar, die den gesamten Status anzeigt, haben?
    Bei ersterem würde ich nach erfolgreichem Download einer Datei

    [autoit]

    _UpdateProgress(0)

    [/autoit]


    aufrufen, um zurückzusetzen.
    Bei zweiterem ware eine zweite Funktion von Vorteil, die zuerst die größe/anzahl der Dateien ermittelt und dann nach herunterladen, den prozentualen Anteil zurückgibt.
    Oder beides? (ala WinRAR etc.)
    (müsste zumindest so funktionieren)

  • Ich denke mal er meinte Variante 2. (oder eine Kombination aus beiden)

    Da du eine fertige Include Funktion benutzt und diese dein gewünschtes Vorhaben nicht bietet (Aber den Ansatz dazu), empfehle ich, einfach mal rein zu schauen in die Include Funktion:

    Spoiler anzeigen
    [autoit]

    ;
    #FUNCTION# ====================================================================================================================
    ; Author ........: limette, Prog@ndy
    ; Modified.......: jchd
    ; ===============================================================================================================================
    Func _FTP_ProgressDownload($l_FTPSession, $s_LocalFile, $s_RemoteFile, $FunctionToCall = "")
    If $__ghWinInet_FTP = -1 Then Return SetError(-2, 0, 0)

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

    Local $fhandle = FileOpen($s_LocalFile, $FO_OVERWRITE + $FO_BINARY)
    If $fhandle < 0 Then Return SetError(-1, 0, 0)

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

    Local $ai_ftpopenfile = DllCall($__ghWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $l_FTPSession, 'wstr', $s_RemoteFile, 'dword', $GENERIC_READ, 'dword', $FTP_TRANSFER_TYPE_BINARY, 'dword_ptr', 0)
    If @error Or $ai_ftpopenfile[0] = 0 Then Return SetError(-3, _WinAPI_GetLastError(), 0)

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

    Local $ai_FTPGetFileSize = DllCall($__ghWinInet_FTP, 'dword', 'FtpGetFileSize', 'handle', $ai_ftpopenfile[0], 'dword*', 0)
    If @error Then Return SetError(-2, _WinAPI_GetLastError(), 0)

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

    If $FunctionToCall = "" Then ProgressOn("FTP Download", "Downloading " & $s_LocalFile)

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

    Local $glen = _WinAPI_MakeQWord($ai_FTPGetFileSize[0], $ai_FTPGetFileSize[2]) ;FileGetSize($s_RemoteFile)
    Local Const $ChunkSize = 256 * 1024
    Local $last = Mod($glen, $ChunkSize)

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

    Local $parts = Ceiling($glen / $ChunkSize)
    Local $buffer = DllStructCreate("byte[" & $ChunkSize & "]")

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

    Local $ai_InternetCloseHandle, $ai_FTPread, $out, $ret, $lasterror
    Local $x = $ChunkSize
    Local $done = 0
    For $i = 1 To $parts
    If $i = $parts And $last > 0 Then
    $x = $last
    EndIf

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

    $ai_FTPread = DllCall($__ghWinInet_FTP, 'bool', 'InternetReadFile', 'handle', $ai_ftpopenfile[0], 'struct*', $buffer, 'dword', $x, 'dword*', $out)
    If @error Or $ai_FTPread[0] = 0 Then
    $lasterror = _WinAPI_GetLastError()
    $ai_InternetCloseHandle = DllCall($__ghWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_ftpopenfile[0])
    ; No need to test @error.
    FileClose($fhandle)
    If $FunctionToCall = "" Then ProgressOff()
    Return SetError(-4, $lasterror, 0)
    EndIf
    $ret = FileWrite($fhandle, BinaryMid(DllStructGetData($buffer, 1), 1, $ai_FTPread[4]))
    If Not $ret Then
    $lasterror = _WinAPI_GetLastError()
    $ai_InternetCloseHandle = DllCall($__ghWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_ftpopenfile[0])
    ; No need to test @error.
    FileClose($fhandle)
    FileDelete($s_LocalFile)
    If $FunctionToCall = "" Then ProgressOff()
    Return SetError(-7, $lasterror, 0)
    EndIf
    $done += $ai_FTPread[4]

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

    If $FunctionToCall = "" Then
    ProgressSet(($done / $glen) * 100)
    Else
    $ret = Call($FunctionToCall, ($done / $glen) * 100)
    If $ret <= 0 Then
    $lasterror = @error
    $ai_InternetCloseHandle = DllCall($__ghWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_ftpopenfile[0])
    ; No need to test @error.
    FileClose($fhandle)
    FileDelete($s_LocalFile)
    If $FunctionToCall = "" Then ProgressOff()
    Return SetError(-6, $lasterror, $ret)
    EndIf
    EndIf
    Sleep(10)
    Next

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

    FileClose($fhandle)

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

    If $FunctionToCall = "" Then ProgressOff()

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

    $ai_InternetCloseHandle = DllCall($__ghWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_ftpopenfile[0])
    If @error Or $ai_InternetCloseHandle[0] = 0 Then
    Return SetError(-5, _WinAPI_GetLastError(), 0)
    EndIf

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

    Return 1
    EndFunc ;==>_FTP_ProgressDownload

    [/autoit]


    100% habe ich den Code nicht angeschaut und verstanden. Aber ich vermute mal es funktioniert folgendermaßen:

    Es wird die Dateigröße ermittelt (Progressbar max value), darauffolgend wird die Datei heruntergeladen. Das Wachstum der gerade im Download befindlichen Datei wird bis zur vorher ermittelten Dateigröße ausgelesen - (ist somit also der Progressbar Fortschritt)

    Du musst die Funktion im Prinzip so abändern, dass zunächst die Dateigröße aller Dateien ermittelt wird und dann addiert wird ( Progressbar max value...) und dass die Dateien nacheinander heruntergeladen werden und deren Größenzunahme addiert werden (Fortschritt der Progressbar)

  • Ja super! Vielen Dank für den Ansatz. Aber das "Brett vorm Kopf" ist noch ziemlich dick. Was ich bis jetzt hab, habe in die Funktion ein "iniwrite" eingebaut der alle Dateigrößen in eine ini schreibt. Anschießend alle Werte addiert. Aber mir fehlt jetzt der Einbau in die Progressbar. Hat jemand noch einen Ansatz für mich?

    [autoit]


    $readsize = IniReadSection(@ScriptDir & "\size.ini","size")
    For $i = 1 To $readsize[0][0]
    $sum += $readsize[$i][1]
    $readdata = IniWrite(@ScriptDir & "\size.ini","gen","sum",$sum)
    Next

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

    Func _FTP_ProgressDownloadFILESIZE($l_FTPSession, $s_LocalFile, $s_RemoteFile, $FunctionToCall = "")

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

    ....
    IniWrite(@ScriptDir & "\size.ini","size",$s_RemoteFile,$ai_FTPGetFileSize[0])
    ....
    EndFunc ;==>_FTP_ProgressDownload

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