[Beispiel] Update 13.03.13 FTP-Downloader (rekursiv mit allen Unterverzeichnissen)

  • Hallo Com.

    da es immer wieder Fragen zum FTP-Download eines ganzen Ordner gubt habe ich ein Beispielskript dafür erstellt.

    Achtung: läuft unter 3.3.6.1 Benutzer von 3.3.8.1 können anhand von Bekannte Bugs in 3.3.8.1? erkennen was sie ändern müssen damit es auch darunter läuft. Bzw. sie nutzen den WorkArround aus dem Anhang, mehr Komfort bietet aber die Originalversion.

    die nötigen Funktionen habe ich in FTP_FileList_Recursiv.au3 ausgelagert. Diese UDF beinhaltet:

    • _getAllFTPFilesRekursiv: lädt einen bestimmten Ordner inkl. aller Unterverzeichnisse herunter
    • _createLocalDirIfNecessary prüft ob für eine Datei die lokale Verzeichnisstruktur besteht, falls nötig wird diese angelegt
    • _FTP_FileList_Rekursiv2D füllt ein Array mit Dateien (und Verzeichnissen wenn $bFolders true) des FTP-Pfades inkl. aller Unterverzeichnisse auch die Dateigrösse wird eingetragen
    • _FTP_FileList_Rekursiv füllt ein Array mit Dateien (und Verzeichnissen wenn $bFolders true) des FTP-Pfades inkl. aller Unterverzeichnisse. Diese Funktion sammelt die Daten und wird von _FTP_FileList_Rekursiv2D aufgerufen, welche dann die Daten in Pfad und Grösse splittet. Sie kann aber auch einzeln aufgerufen werden. Die darin verwendetete Func [autoit]_Ftp_ListToArray2D[/autoit] ist daran Schuld dass die UDF nicht unter 3.3.8.1 verwendet werden kann. Eine abgewandelte Version _FTP_FileList_RekursivWA welche auch unter 3.3.8.1 läuft findet man im ANhang, allerdings sind damit die Zusatzfeatures wie Fortschrittsanzeige nach Dateigrösse nicht realisierbar.

    Sie befindet sich im Anhang. Hier das Skript:

    benötigt FTP_FileList_Recursiv.au3<br>
    [autoit]

    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include "FTP_FileList_Recursiv.au3"

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

    ;veröffentlicht unter http://www.autoit.de/index.php?page…1617#post251617

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

    Opt('MustDeclareVars', 1)

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

    _CreateGui()

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

    Func _CreateGui()
    Local $l_InternetSession = -99, $l_FTPSession
    Local $errOpen, $errFTP
    Local $nMsg
    Global $GUI = GUICreate("FTP-Downloader", 623, 450, 271, 235)
    Local $idLblLog = GUICtrlCreateEdit("", 8, 5, 467, 315, $ES_READONLY)
    Local $idPrgFile = GUICtrlCreateProgress(8, 344, 598, 25)
    Local $hGuiChild1 = GUICreate("Child1", 594, 21, 10, 346, $WS_POPUP, $WS_EX_MDICHILD, $GUI)
    Local $idLblFilePer = GUICtrlCreateLabel("", 2, 2, 590, 17, $SS_CENTER)
    GUICtrlSetFont(-1, 11, 2800)
    WinSetTrans($hGuiChild1, "", 180)
    GUISwitch($GUI)
    Local $idLblFile = GUICtrlCreateLabel("", 8, 322, 594, 17)
    Local $idPrgKB = GUICtrlCreateProgress(8, 392, 598, 25)
    Local $hGuiChild2 = GUICreate("Child2", 595, 23, 10, 394, $WS_POPUP, $WS_EX_MDICHILD, $GUI)
    Local $idLblKBPer = GUICtrlCreateLabel("", 2, 1, 590, 19, $SS_CENTER)
    GUICtrlSetFont(-1, 11, 2800)
    WinSetTrans($hGuiChild2, "", 180)
    GUISwitch($GUI)
    Local $idLblKB = GUICtrlCreateLabel("", 8, 372, 594, 17)
    Local $idBtnConnect = GUICtrlCreateButton("&Verbinden", 483, 40) ;verbinden mit FTP-Server
    Local $idBtnDisconnect = GUICtrlCreateButton("&Trennen", 483, 80) ;vom Server trennen
    Local $idBtnDL = GUICtrlCreateButton("&Download", 483, 120) ;Download starten
    Local $idBtnExit = GUICtrlCreateButton("Be&enden", 483, 160) ;Exit
    GUICtrlSetState($idBtnDL, $GUI_DISABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_DISABLE)

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

    #Region;falls aktiviert Positionen noch anpasser und Labeltext entfernen
    Local $idLblColapsedTime = GUICtrlCreateLabel("", 8, 420, 400, 17)

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

    Local $idLblKBperSec = GUICtrlCreateLabel("", 450, 420, 500, 17)
    #EndRegion
    GUISetState(@SW_SHOW, $hGuiChild1)
    GUISetState(@SW_SHOW, $hGuiChild2)
    GUISetState(@SW_SHOW, $GUI)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $idBtnExit
    If $l_InternetSession <> -99 Then _FTP_Close($l_InternetSession)
    Exit
    Case $idBtnConnect
    $l_InternetSession = _FTP_Open('AutoItZilla') ;Öffnet eine FTP Sitzung
    $errOpen = @error
    If Not @error Then
    $l_FTPSession = _FTP_Connect($l_InternetSession, 'ftp.csx.cam.ac.uk', '', '', 0) ;Verbindet zu einem FTP Server
    $errFTP = @error
    If Not @error Then
    GUICtrlSetState($idBtnDL, $GUI_ENABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_ENABLE)
    GUICtrlSetState($idBtnConnect, $GUI_DISABLE)
    Else
    ;MsgBox(0, "Connect", "fehlgeschlagen")
    ConsoleWrite("Connect: " & " " & $errFTP & @CRLF)
    EndIf
    Else
    ;MsgBox(0, "Open", "fehlgeschlagen")
    ConsoleWrite("Open " & " " & $errOpen & @CRLF)
    EndIf
    Case $idBtnDisconnect
    _FTP_Close($l_InternetSession)
    $l_InternetSession = -99
    GUICtrlSetState($idBtnDL, $GUI_DISABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_DISABLE)
    GUICtrlSetState($idBtnConnect, $GUI_ENABLE)
    Case $idBtnDL
    GUICtrlSetState($idBtnDL, $GUI_DISABLE)
    GUICtrlSetState($idBtnExit, $GUI_DISABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_DISABLE)
    _getAllFTPFilesRekursiv($l_FTPSession, '/', @ScriptDir & "\Temp", 1, $idPrgKB, $idLblKB, $idLblKBPer, $idPrgFile, $idLblFile, $idLblFilePer, $idLblColapsedTime, $idLblKBperSec, $idLblLog) ;<======= anpassen Remotepfad der inkl. aller Unerordner heruntergeladen werden soll
    GUICtrlSetState($idBtnDL, $GUI_ENABLE)
    GUICtrlSetState($idBtnExit, $GUI_ENABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_ENABLE)
    EndSwitch
    WEnd
    EndFunc ;==>_CreateGui

    [/autoit]

    Und hier noch ein ScreenShot des Beispielprogrammes:
    autoit.de/wcf/attachment/15481/

    Edit4: Update auf FTP_FileList_Recursiv3.au3:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <FTPEx.au3>
    #include <Array.au3>

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

    ;===============================================================================
    ; Function Name: _getAllFTPFilesRekursiv($l_FTPSession, $sRemote = "", $sLocal = @TempDir, $iMaxDepth, $iDebug = 0, $idPrgKB = 0, $idLblKB = 0, $idLblKBPer = 0, $idPrgFile = 0, $idLblFile = 0, $idLblFilePer = 0, $idLblColapsed = 0, $idLblKBperSec = 0, $idLblLog = 0)
    ; Description:: lädt einen bestimmten Ordner inkl. aller Unterverzeichnisse herunter
    ; Parameter(s): $l_FTPSession das von _FTP_Connect zurückgegebene Handle Angabe ist Pflicht
    ; $sRemote der FTP-Ordner der heruntergeladen werden soll optionale Angabe Leer=Rootverzeichnis
    ; $sLocal der loakle Ordner in dem die Dateien optionale Angabe Leer=@TempDir
    ; gespeichert werden sollen, die Unter-
    ; verzeichnisse werden angelegt
    ; siehe dazu _createLocalDirIfNecessary
    ; $iMaxDepth maximale Rekursionstiefe
    ; <1 = unendlich als Degault eingestellt optionale Angabe
    ; $iDebug sollen Debuginfos in der Scitekosole angezeigt werden? optionale Angabe
    ; Default = 0 = keine DebugInfos,
    ; 1 = Debubinfos anzeigen
    ; 2 = DebugInfos und ArrayDisplays
    ; *** folgende opt. Parameter erleichtern die Sarstellung in einer GUI ***
    ; *** sie sind alle mit 0 vorbelegt, d.h. kein GUI-Control wird upgedatet ***
    ; $idPrgKB ControldID der Progressbar (Dateigrösse) optionale Angabe
    ; $idLblKB " des Labels (anhand der Dateigrösse) optionale Angabe
    ; $idLblKBPer " des Labels für Prozent (Dateigrösse) optionale Angabe
    ; $idPrgFile ControldID der Progressbar (Dateianzahl) optionale Angabe
    ; $idLblFile " des Labels (anhand der Dateianzahl) optionale Angabe
    ; $idLblFilePer " des Labels für Prozent (Dateianzahl) optionale Angabe
    ; $idLblColapsed " des Labes für benötigte Zeit optionale Angabe
    ; $idLblKBperSec " des Labels für erreichte KB/sec optionale Angabe
    ; $idLblLog " des Edits Logübersicht optionale Angabe
    ; Autor(s): AutoBert (http://www.autoit.de)
    ; zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
    ; dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
    ;===============================================================================
    Func _getAllFTPFilesRekursiv($l_FTPSession, $sRemote = "", $sLocal = @TempDir, $iMaxDepth=-1, $iDebug = 0, $idPrgKB = 0, $idLblKB = 0, $idLblKBPer = 0, $idPrgFile = 0, $idLblFile = 0, $idLblFilePer = 0, $idLblColapsed = 0, $idLblKBperSec = 0, $idLblLog = 0)
    Local $aResult[1][2]
    Local $errGet
    Local $s_LocalFile
    Local $iKBPer, $iFilePer, $iKB_Already, $iStart, $iSec, $sMsg, $sLog
    ToolTip('Searching for files to download, please wait...') ;kann auskommentiert werden

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

    If $idLblColapsed <> 0 Or $idLblKBperSec <> 0 Then $iStart = TimerInit()
    _FTP_FileList_Rekursiv2D($l_FTPSession, $aResult, $sRemote, False, $iMaxDepth, $iDebug)
    ToolTip('Downloading, please wait...') ;kann auskommentiert werden
    For $i = 1 To $aResult[0][0]
    $s_LocalFile = $sLocal & "\" & StringTrimLeft($aResult[$i][0], 1)
    $s_LocalFile = StringReplace($s_LocalFile, "/", "\")
    _createLocalDirIfNecessary($s_LocalFile)
    If $iDebug Then ConsoleWrite("Download: " & $i & "/" & $aResult[0][0] & " :" & $aResult[$i][0] & @TAB)
    If $idLblLog <> 0 Then $sLog = "Download: " & $i & "/" & $aResult[0][0] & " :" & $aResult[$i][0] & @TAB
    If $idLblFile <> 0 Then GUICtrlSetData($idLblFile, $aResult[$i][0] & @TAB & $i & "/" & $aResult[0][0])
    If _FTP_FileGet($l_FTPSession, $aResult[$i][0], $s_LocalFile) Then;,"_UpdateProgress") Then
    $errGet = @error
    If $iDebug Then ConsoleWrite("erfolgreich ")
    If $idLblLog <> 0 Then $sLog &= "erfolgreich "
    $iKB_Already += $aResult[$i][1]
    Else
    If $iDebug Then ConsoleWrite("fehlgeschlagen ")
    If $idLblLog <> 0 Then $sLog &= "fehlgeschlagen "
    If _FTP_DirSetCurrent($l_FTPSession, $aResult[$i][0]) Then
    If $iDebug Then ConsoleWrite(" da ein Mountpoint ")
    If $idLblLog <> 0 Then $sLog &= " da ein Mountpoint "
    $aResult[0][1] -= $aResult[$i][1] ;kein Fehler daher von Gesamtsumme abziehen
    EndIf
    EndIf
    If $iDebug Then ConsoleWrite($errGet & @CRLF)
    If $idLblLog <> 0 Then
    $sLog &= @CRLF
    GUICtrlSetData($idLblLog, GUICtrlRead($idLblLog) & $sLog)
    EndIf
    If $idPrgFile <> 0 Or $idLblFilePer <> 0 Then ;Prozente anhand Dateianzahl errechnen und anzeigen
    $iFilePer = Int($i / $aResult[0][0] * 100)
    If $idPrgFile <> 0 Then GUICtrlSetData($idPrgFile, $iFilePer)
    If $idLblFilePer <> 0 Then GUICtrlSetData($idLblFilePer, $iFilePer & "%")
    EndIf
    If $idPrgKB <> 0 Or $idLblKBPer <> 0 Then ;Prozente anhand Grösse errechnen und anzeigen
    $iKBPer = Int($iKB_Already / $aResult[0][1] * 100)
    If $idPrgKB <> 0 Then GUICtrlSetData($idPrgKB, $iKBPer)
    If $idLblKBPer <> 0 Then GUICtrlSetData($idLblKBPer, $iKBPer & "%")
    EndIf
    If $idLblKB <> 0 Then GUICtrlSetData($idLblKB, $iKB_Already & @TAB & "/" & $aResult[0][1])
    ;If $iDebug Then ConsoleWrite(@CRLF)
    Next
    If $idLblColapsed <> 0 Or $idLblKBperSec <> 0 Then
    $iSec = TimerDiff($iStart) / 1000
    If $idLblKBperSec <> 0 Then GUICtrlSetData($idLblKBperSec, Round($iKB_Already / 1024 / $iSec, 2) & "KB/sec")
    If $idLblColapsed <> 0 Then
    Local $iMin = Int($iSec / 60), $iHour
    If $iMin > 0 Then
    $iSec -= $iMin * 60
    $iHour = Int($iMin / 60)
    If $iHour > 0 Then
    $iMin -= $iHour * 60
    $sMsg = StringFormat("%02d:%02d Stunden", $iHour, $iMin, $iSec)
    Else
    $sMsg = StringFormat("%02d:%02d Minuten", $iMin, $iSec)
    EndIf
    Else
    If $iSec > 0 Then $sMsg = StringFormat("%02d Sekunden", $iSec)
    EndIf
    GUICtrlSetData($idLblColapsed, "benötigt: " & $sMsg)
    EndIf
    EndIf
    ToolTip('') ;kann auskommentiert werden
    EndFunc ;==>_getAllFTPFilesRekursiv

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

    ;===============================================================================
    ; Function Name: _createLocalDirIfNecessary($s_LocalFile)
    ; Description:: prüft ob für eine Datei die lokale Verzeichnisstruktur besteht, falls nötig wird diese angelegt
    ; Parameter(s): $s_LocalFile Dateuname für den die Verzeichnisstruktur geprüft werden soll
    ; Autor(s): AutoBert (http://www.autoit.de)
    ; zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
    ; dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
    ;===============================================================================
    Func _createLocalDirIfNecessary($s_LocalFile)
    Local $aLocalPath = StringSplit($s_LocalFile, "\") ;hier lokale Pfad erstellen falls notwendig
    Local $sLocalPath = ""
    For $j = 1 To $aLocalPath[0] - 1
    $sLocalPath &= $aLocalPath[$j] & "\"
    If Not FileExists($sLocalPath) And Not StringInStr($aLocalPath[$j], ":") Then
    ;ConsoleWrite($sLocalPath & @CRLF)
    DirCreate($sLocalPath)
    EndIf
    Next
    EndFunc ;==>_createLocalDirIfNecessary

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

    ;===============================================================================
    ; Function Name: _FTP_FileList_Rekursiv2D($l_FTPSession, $aResult, $sPath, $bFolders=False, $iMaxDepth=-1, $iDebug=0)
    ; Description:: füllt ein Array mit Dateien (und Verzeichnissen wenn $bFolders true) des FTP-Pfades inkl. aller Unterverzeichnisse
    ; Parameter(s): $l_FTPSession das von _FTP_Connect zurückgegebene Handle
    ; $aResult = das Array in dem die Ergebnisse eingefügt werden
    ; $sPath = Verzeichnispfad, der eingefügt werden soll
    ; $bFolders = True = auch Verzeichnisse einfügen, False = nur Dateien, Default = nur Dateien
    ; $iMaxDepth maximale Rekursionstiefe
    ; <1 = unendlich als Degault eingestellt optionale Angabe
    ; $iDebug sollen Debuginfos in der Scitekosole angezeigt werden?
    ; Default = 0 = keine DebugInfos,
    ; 1 = Debubinfos anzeigen
    ; 2 = DebugInfos und ArrayDisplays
    ; Autor(s): AutoBert (http://www.autoit.de)
    ; zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
    ; dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
    ;
    ; Achtung benötugt bugfreie Version von FTPEx.au3 (3.3.6.1)
    ;===============================================================================
    Func _FTP_FileList_Rekursiv2D($l_FTPSession, ByRef $aResult, $sPath, $bFolders = False, $iMaxDepth=-1, $iDebug = 0)
    Local $aTmp[1] ;das Array das für _FTP_FileList_Rekursiv benötigt wird
    Local $aSplit
    _FTP_FileList_Rekursiv($l_FTPSession, $aTmp, $sPath, $bFolders, $iMaxDepth, $iDebug, True)
    If $iDebug = 2 Then _ArrayDisplay($aTmp) ;kann auskommentiert werden
    If IsArray($aTmp) Then
    $aTmp[0] = UBound($aTmp) - 1
    ReDim $aResult[$aTmp[0] + 1][2]
    $aResult[0][0] = $aTmp[0]
    For $i = 1 To $aResult[0][0]
    $aSplit = StringSplit($aTmp[$i], "|")
    $aResult[$i][0] = $aSplit[1]
    If $aSplit[0] > 1 Then
    $aResult[$i][1] = $aSplit[2]
    $aResult[0][1] += $aSplit[2]
    EndIf
    Next
    EndIf
    If $iDebug = 2 Then _ArrayDisplay($aResult) ;kann auskommentiert werden
    EndFunc ;==>_FTP_FileList_Rekursiv2D

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

    ;===============================================================================
    ; Function Name: _FTP_FileList_Rekursiv($l_FTPSession, $aResult, $sPath, $bFolders=False,$iDebug=0,§b2D=False)
    ; Description:: füllt ein Array mit Dateien (und Verzeichnissen wenn $bFolders true) des FTP-Pfades inkl. aller Unterverzeichnisse
    ; Parameter(s): $l_FTPSession das von _FTP_Connect zurückgegebene Handle
    ; $aResult = das Array in dem die Ergebnisse eingefügt werden
    ; $sPath = Verzeichnispfad, der eingefügt werden soll
    ; $bFolders = True = auch Verzeichnisse einfügen, False = nur Dateien, Default = nur Dateien
    ; $iMaxDepth = <1 = Rekursion bis zum letzten Ästchen, jede andere Zahl stellt die max. Rekursionstiefe ein
    ; $iDebug sollen Debuginfos in der Scitekosole angezeigt werden? Default = 0 = keine, 1=mit, 2)mit + Arraydisplay
    ; $b2D als Vorbereutung für _FTP_FileList_Rekursiv2D Default=False
    ; wird nur benötigt wenn von _FTP_FileList_Rekursiv2D aufgerufen daher nicht selbst setzen
    ; $iDepth für internen Gebrauch daher nicht selbst setzen
    ; Autor(s): AutoBert (http://www.autoit.de)
    ; zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
    ; dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
    ;
    ; Achtung benötugt bugfreie Version von FTPEx.au3 (3.3.6.1)
    ;===============================================================================
    Func _FTP_FileList_Rekursiv($l_FTPSession, ByRef $aResult, $sPath, $bFolders = False, $iMaxDepth=-1, $iDebug = 0, $b2D = False, $iDepth=0)
    Local $aFiles, $aFolders
    If $sPath = "/" Then $sPath = ""
    If $iDebug Then ConsoleWrite($sPath & @TAB & $iDepth & '/' & $iMaxDepth & @CRLF)
    If $iMaxDepth > 0 Then
    If $iDepth > $iMaxDepth Then Return
    EndIf
    $iDepth += 1
    If $sPath <> "" Then
    _FTP_DirSetCurrent($l_FTPSession, $sPath)
    If @error Then
    If $iDebug Then ConsoleWrite("Remoteverzeichnis: " & $sPath & " existiert nicht!")
    Return
    Else
    $sPath = _FTP_DirGetCurrent($l_FTPSession)
    EndIf
    EndIf
    $aFiles = _Ftp_ListToArray2D($l_FTPSession, 2)
    If IsArray($aFiles) Then
    If $iDebug = 2 Then _ArrayDisplay($aFiles)
    If $aFiles[0][0] > 0 Then
    For $i = 1 To $aFiles[0][0]
    If $b2D Then
    _ArrayAdd($aResult, $sPath & "/" & $aFiles[$i][0] & "|" & $aFiles[$i][1])
    If $iDebug Then ConsoleWrite("File: " & $sPath & "/" & $aFiles[$i][0] & "|" & $aFiles[$i][1] & @CRLF)
    Else
    _ArrayAdd($aResult, $sPath & "/" & $aFiles[$i][0])
    If $iDebug Then ConsoleWrite("File: " & $sPath & "/" & $aFiles[$i][0] & @CRLF)
    EndIf
    Next
    EndIf
    EndIf
    $aFolders = _Ftp_ListToArray2D($l_FTPSession, 1)
    If $iDebug = 2 Then _ArrayDisplay($aFolders)
    If IsArray($aFolders) Then
    If $aFolders[0][0] > 0 Then
    For $i = 1 To $aFolders[0][0]
    If $aFolders[$i][0] <> '.' And $aFolders[$i][0] <> '..' Then
    If $iDebug Then ConsoleWrite("Folder: " & $sPath & "/" & $aFolders[$i][0] & "|" & $aFolders[$i][1] & @CRLF)
    If $bFolders Then _ArrayAdd($aResult, $sPath & "/" & $aFolders[$i][0] & "|" & $aFolders[$i][1])
    _FTP_FileList_Rekursiv($l_FTPSession, $aResult, $sPath & "/" & $aFolders[$i][0], $bFolders, $iMaxDepth, $iDebug, $b2D,$iDepth)
    EndIf
    Next
    EndIf
    EndIf
    EndFunc ;==>_FTP_FileList_Rekursiv

    [/autoit]

    in dieser Version für AutoIt 3.6.6.1 ist es möglich die Rekursionstiefe zu beschränken, da ich die neu benötigten Parameter nicht einfach hinten angehängt habe ist auch eine neue Demo fällig:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include "FTP_FileList_Recursiv3.au3"

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

    Opt('MustDeclareVars', 1)

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

    _CreateGui()

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

    Func _CreateGui()
    Local $l_InternetSession = -99, $l_FTPSession
    Local $errOpen, $errFTP
    Local $nMsg
    Local $iMaxDepth=3;max 3 vereichnisebenen <1=unendliche Rekrusionstiefe
    Local $GUI = GUICreate("FTP-Downloader", 623, 450, 271, 235)
    Local $idLblLog = GUICtrlCreateEdit("", 8, 5, 467, 315, $ES_READONLY)
    Local $idPrgFile = GUICtrlCreateProgress(8, 344, 598, 25)
    Local $hGuiChild1 = GUICreate("Child1", 594, 21, 10, 346, $WS_POPUP, $WS_EX_MDICHILD, $GUI)
    Local $idLblFilePer = GUICtrlCreateLabel("", 2, 2, 590, 17, $SS_CENTER)
    GUICtrlSetFont(-1, 11, 2800)
    WinSetTrans($hGuiChild1, "", 180)
    GUISwitch($GUI)
    Local $idLblFile = GUICtrlCreateLabel("", 8, 322, 594, 17)
    Local $idPrgKB = GUICtrlCreateProgress(8, 392, 598, 25)
    Local $hGuiChild2 = GUICreate("Child2", 595, 23, 10, 394, $WS_POPUP, $WS_EX_MDICHILD, $GUI)
    Local $idLblKBPer = GUICtrlCreateLabel("", 2, 1, 590, 19, $SS_CENTER)
    GUICtrlSetFont(-1, 11, 2800)
    WinSetTrans($hGuiChild2, "", 180)
    GUISwitch($GUI)
    Local $idLblKB = GUICtrlCreateLabel("", 8, 372, 594, 17)
    Local $idInpMaxDepth= GUICtrlCreateInput("",483,5,35,22,$ES_NUMBER)
    GUICtrlSetTip(-1,'Maxinale Rekursionstiefe,<1=unendlich')
    Local $idBtnConnect = GUICtrlCreateButton("&Verbinden", 483, 40) ;verbinden mit FTP-Server
    Local $idBtnDisconnect = GUICtrlCreateButton("&Trennen", 483, 80) ;vom Server trennen
    Local $idBtnDL = GUICtrlCreateButton("&Download", 483, 120) ;Download starten
    Local $idBtnExit = GUICtrlCreateButton("Be&enden", 483, 160) ;Exit
    GUICtrlSetState($idBtnDL, $GUI_DISABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_DISABLE)

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

    #Region;falls aktiviert Positionen noch anpasser und Labeltext entfernen
    Local $idLblColapsedTime = GUICtrlCreateLabel("", 8, 420, 400, 17)

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

    Local $idLblKBperSec = GUICtrlCreateLabel("", 450, 420, 500, 17)
    #EndRegion
    GUISetState(@SW_SHOW, $hGuiChild1)
    GUISetState(@SW_SHOW, $hGuiChild2)
    GUISetState(@SW_SHOW, $GUI)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $idBtnExit
    If $l_InternetSession <> -99 Then _FTP_Close($l_InternetSession)
    Exit
    Case $idBtnConnect
    $l_InternetSession = _FTP_Open('AutoItZilla') ;Öffnet eine FTP Sitzung
    $errOpen = @error
    If Not @error Then
    $l_FTPSession = _FTP_Connect($l_InternetSession, 'ftp.csx.cam.ac.uk', '', '', 0) ;Verbindet zu einem FTP Server
    $errFTP = @error
    If Not @error Then
    GUICtrlSetState($idBtnDL, $GUI_ENABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_ENABLE)
    GUICtrlSetState($idBtnConnect, $GUI_DISABLE)
    Else
    ;MsgBox(0, "Connect", "fehlgeschlagen")
    ConsoleWrite("Connect: " & " " & $errFTP & @CRLF)
    EndIf
    Else
    ;MsgBox(0, "Open", "fehlgeschlagen")
    ConsoleWrite("Open " & " " & $errOpen & @CRLF)
    EndIf
    Case $idBtnDisconnect
    _FTP_Close($l_InternetSession)
    $l_InternetSession = -99
    GUICtrlSetState($idBtnDL, $GUI_DISABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_DISABLE)
    GUICtrlSetState($idBtnConnect, $GUI_ENABLE)
    Case $idBtnDL
    $iMaxDepth=Int(GUICtrlRead($idInpMaxDepth))
    GUICtrlSetState($idBtnDL, $GUI_DISABLE)
    GUICtrlSetState($idBtnExit, $GUI_DISABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_DISABLE)
    _getAllFTPFilesRekursiv($l_FTPSession, '/', @ScriptDir & "\Temp", $iMaxDepth, 1, $idPrgKB, $idLblKB, $idLblKBPer, $idPrgFile, $idLblFile, $idLblFilePer, $idLblColapsedTime, $idLblKBperSec, $idLblLog) ;<======= anpassen Remotepfad der inkl. aller Unerordner heruntergeladen werden soll
    ;_getAllFTPFilesRekursiv($l_FTPSession, $sRemote = "", $sLocal = @TempDir, $iMaxDepth , $iDebug, $idPrgKB, $idLblKB, $idLblKBPer, $idPrgFile, $idLblFile, $idLblFilePer, $idLblColapsed = 0, $idLblKBperSec, $idLblLog)
    GUICtrlSetState($idBtnDL, $GUI_ENABLE)
    GUICtrlSetState($idBtnExit, $GUI_ENABLE)
    GUICtrlSetState($idBtnDisconnect, $GUI_ENABLE)
    EndSwitch
    WEnd
    EndFunc ;==>_CreateGui

    [/autoit]

    und da durch die Beschränkung auf 5 Dateien mussten die beiden Ursprungsdateien weichen (bisher 90 mal herunter geladen).

    Edit5: auch in die Versionen für AutoIt 3.3.8.1 die Möglichkeit zur Rekursionstiefenbeschränkung eingebaut. Hier war es möglich die Parameter einfach hinten anzuhängen zur Unterscheidung aber trotzdem eine 3 als VersionsNr. angehängt (bisher 92 mal herunter geladen).

    mfg autoBert

  • Moin autoBert.

    Achtung: läuft unter 3.3.6.1? Da ist es doch gut, das die liebe Alina alle alten Autoit-Versionen brav aufbewahrt hat. Nein, ich bewahre die immer auf, da ich zu foul bin einige Sachen von einer Version auf die andere umzustellen.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • @all, Sorry für's Ausgraben des etwas älteren Threads

    Hallo autoBert...

    Klasse Script, genau so etwas in der Art habe ich gesucht :)

    Eine Frage, bzw einen Erweiterungvorschlag, habe ich dennoch...
    Ist es evtl. noch machbar (bestimmt, nur hab ich da kein Plan von, und könnte es sehr gut gebrauchen)
    eine einstellbare Pfadtiefe (als z.B. "lese nur die ersten drei Ebenen ein") mit einzubauen?

    Mfg Diggidie

  • Eine Frage, bzw einen Erweiterungvorschlag, habe ich dennoch...
    Ist es evtl. noch machbar (bestimmt, nur hab ich da kein Plan von, und könnte es sehr gut gebrauchen)
    eine einstellbare Pfadtiefe (als z.B. "lese nur die ersten drei Ebenen ein") mit einzubauen?


    Sollte kein Problem darstellen, ich schau bei Gelegenheit danach.
    Für die komfortable Version (AutoIt 3.6.6.1) erledigt.

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (13. März 2013 um 13:50)

  • Echt COOL und ein dickes DANKE dafür...

    Hab es gerade getestet und funktioniert...

    Was jedoch ein wenig irretierend ist, ist das "|0" hinter den Verzeichnisnamen, welches man
    im ArrayDisplay angezeigt bekommt, wenn $bFolders=False auf "True" gesetzt ist...

    Was natürlich auch noch sehr fein wäre, wenn man bei $bFolders noch die Möglichkeit hätte,
    nur Verzeichnisse ausgeben zu lassen...

    Meine Hoffnung besteht ja immer noch darin, das mal ein vernünftiger FTP-Explorer in AutoIt
    programmiert wird... habe bis jetzt leider keinen gefunden :( Falls jemand einen kennt, bitte
    raus mit der Sprache... Mir würde es ja schon reichen zu wissen, wie ich jetzt das erstellte
    Array in ein TreeView (mit Ansicht aller Verzeichnisse und Dateien) mit der entsprechenden
    Navigation einbauen kann, um dann mit Mausklick auf einer Datei, entsprechende Datei-Operationen
    ausführen zu können... z.B. Rename, Delete, Copy usw.

    Mfg Diggidie und nach mal Danke autoBert...