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>
#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"
;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)
#Region;falls aktiviert Positionen noch anpasser und Labeltext entfernen
Local $idLblColapsedTime = GUICtrlCreateLabel("", 8, 420, 400, 17)
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
Und hier noch ein ScreenShot des Beispielprogrammes:
autoit.de/wcf/attachment/15481/
Edit4: Update auf FTP_FileList_Recursiv3.au3:
Spoiler anzeigen
#include-once
#include <FTPEx.au3>
#include <Array.au3>
;===============================================================================
; 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
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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
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
#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"
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)
#Region;falls aktiviert Positionen noch anpasser und Labeltext entfernen
Local $idLblColapsedTime = GUICtrlCreateLabel("", 8, 420, 400, 17)
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
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