Hallo Zusammen,
ich habe ein Problem mit FTPEx und weiß nicht wo der Fehler liegt.
Liegt es an meinem Programm, liegt es an der UDF oder wo ist der Hund begraben?
Ich lese normalerweise rekursiv ein Verzeichnis eines ftp-Sververs aus und schreibe das Ergebnis nach meinen Wünschen in eine Datei. Speziell handelt es sie hier um den ftp-Server ftp://service.avm.de, damit ich Änderungen auf dem Server mitbekomme. Doch seit einigen Wochen funktionierte mein Hauptscript nicht mehr und ich habe jetzt versucht, das Problem zu isolieren. Ich konnte zumindest ermitteln, woran es liegt. Es treten immer dann Fehler auf, wenn das Verzeichnis mit "./" (Punkt Schrägstrich) endet, also zum Beispiel "ftp://service.avm.de/Beta/FRITZ!Box_7340_int./".
Sobald ich den Inhalt ein mit "./" (Punkt Schrägstrich) endendes Verzeichnis auslese, kommt es danach zu Problemen. Es spielt auch keine Rolle, ob ich den Schrägstrich weglasse.
Hier mein auf das Wichtigste abgestrippte Testprogramm mit 5 Varianten.
Nur in Variante 1 wird alles richtig ausgegeben, da eben kein besagtes Verzeichnis mit aufgelistet wird.
In Variante 2 lese ich als erstes ein solches Verzeichnis aus, wobei da noch der Inhalt richtig ausgegeben wird, aber es kommt nachfolgend dann zu Problemen, sprich es wird ab und an was völlig falsches zurückgeliefert.
Varianten 3 bis 5 sind verschiedene Zusammenstellungen, um ggf. den Fehler einzugrenzen. Liefern alle irgendwo dann auf einmal falsche Ergebnisse zurück.
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Version=Beta
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <FTPEx.au3>
#include <Array.au3>
; ftp-Daten zum Setzen
#Region VarToSet
; ftp-Server
Global $server = 'service.avm.de'
Global $username = ''
Global $userpassword = ''
#EndRegion VarToSet
; interne Variablen
#Region internal vars
; MsgBox
Global Const $Mnormal = 0 + 262144
Global Const $Merror = 16 + 262144
Global Const $Mquestion = 32 + 262144
Global Const $Machtung = 48 + 262144
Global Const $Mergebnis = 64 + 262144
Global $return
Global $return
; ftp-handle
Global $ftpOpenHdl
Global $ftpConnect
#EndRegion internal vars
; --- Main ---
#Region main
; Opens an FTP session
$ftpOpenHdl = _FTP_Open('MyFTP Control' & Random(0, 1000, 1), $INTERNET_OPEN_TYPE_DIRECT) ; $INTERNET_OPEN_TYPE_DIRECT -> no proxy
If @error > 0 Or $ftpOpenHdl == 0 Then
MsgBox($Merror, "ftp-error", 'ftp-open zu "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
_FTP_Close($ftpOpenHdl)
Exit
EndIf
; Connects to an FTP server
$ftpConnect = _FTP_Connect($ftpOpenHdl, $server, $username, $userpassword)
If @error > 0 Or $ftpConnect == 0 Then
MsgBox($Merror, "ftp-error", 'ftp-connect zu "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
_FTP_Close($ftpOpenHdl)
Exit
EndIf
ConsoleWrite("ftp-connect: " & String($ftpConnect) & @CRLF)
; -- Ab hier gibt es 4 Testscenarien --
$return = Number(InputBox("Welche Variante soll getestet werden?", "Varianten 1-5", 1, "", 350, 140))
Switch $return
Case 1 ; -- Variante 1 ----> alles wird korrekt ausgegeben
; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
ftpListDir('/')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta')
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta')
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
Case 2 ; -- Variante 2 ----> liefert falsches Ergebnis
; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
; Als erstes '/Beta/FRITZ!Box_7340_int.' ausgeben
ftpListDir('/Beta/FRITZ!Box_7340_int.') ; ftp://service.avm.de/Beta/FRITZ!Box_7340_int./ <----- liefert hier richtiges Ergebnis
ftpListDir('/')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta') ; <----- liefert hier jetzt FALSCHES Ergebnis!
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta'); <----- liefert hier jetzt FALSCHES Ergebnis!
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
Case 3 ; -- Variante 3 ----> liefert falsches Ergebnis
; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
; Ausgabe von '/Beta/FRITZ!Box_7340_int.' nach weiter hinten verfrachtet
ftpListDir('/')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta')
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta/FRITZ!Box_7340_int.') ; ftp://service.avm.de/Beta/FRITZ!Box_7340_int./ <----- liefert falsches Ergebnis
ftpListDir('/Beta')
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta')
ftpListDir('/Beta/FRITZ!Box_7320')
Case 4 ; -- Variante 4 ----> liefert falsches Ergebnis
; Diverse Verzeichnisse ausgeben (ftp://service.avm.de/)
; Als erstes diesmal "/Beta/FRITZ!Box_7390_int." anstatt '/Beta/FRITZ!Box_7340_int.' ausgeben
ftpListDir("/Beta/FRITZ!Box_7390_int.") ; ftp://service.avm.de/Beta/FRITZ!Box_7390_int./ <----- liefert hier richtiges Ergebnis
ftpListDir('/')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta') ; <----- liefert hier jetzt FALSCHES Ergebnis!
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
ftpListDir('/Beta'); <----- liefert hier jetzt FALSCHES Ergebnis!
ftpListDir('/Arcor6000')
ftpListDir('/Beta/FRITZ!Box_7320')
Case 5 ; -- Variante 5 ----> liefert falsches Ergebnis
ftpListDir('/Beta/FRITZ!Box_7340_int.') ; ftp://service.avm.de/Beta/FRITZ!Box_7340_int./ <----- liefert hier richtiges Ergebnis
ftpListDir("/Beta/FRITZ!Box_7390_int.") ; ftp://service.avm.de/Beta/FRITZ!Box_7390_int./ <----- liefert hier jetzt FALSCHES Ergebnis!
ftpListDir("/Beta/FRITZ!Box_7390_int.") ; ftp://service.avm.de/Beta/FRITZ!Box_7390_int./ <----- liefert hier jetzt FALSCHES Ergebnis!
ftpListDir('/Beta') ; <----- liefert hier jetzt FALSCHES Ergebnis!
Case Else ; falsche Eingabe
MsgBox($Merror, "Eingabefehler", 'Es sind nur Zahlen von 1-5 erlaubt und nicht "' & $return & '"')
EndSwitch
$return = _FTP_Close($ftpOpenHdl)
If $return <> 1 Then
MsgBox($Merror, "ftp-error", 'ftp-close von "' & $server & '" fehlgeschlagen!' & @CRLF)
EndIf
#EndRegion main
; --- functions ---
#Region Functions
; Function, die den Inhalt des ftp-Verzeichnises ausgibt (In Console und ArrayDisplay)
Func ftpListDir($MyFtpDir = '/')
Local $ftpCurrentDir
Local $ftpListArray
Local $temp
Local $lreturn
ConsoleWrite('ftpListDir von "' & $MyFtpDir & '"' & @CRLF)
[/autoit] [autoit][/autoit] [autoit]; Get Current Directory on an FTP server
$ftpCurrentDir = _FTP_DirGetCurrent($ftpConnect)
If @error > 0 Or $ftpCurrentDir == 0 Then
MsgBox($Merror, "ftp-error", 'ftp-DirGetCurrent von "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
_FTP_Close($ftpOpenHdl)
Exit
EndIf
ConsoleWrite("ftp-DirGetCurrent: " & String($ftpCurrentDir) & @CRLF)
; Set Current Directory on an FTP server
$lreturn = _FTP_DirSetCurrent($ftpConnect, $MyFtpDir)
If @error > 0 Or $lreturn <> 1 Then
MsgBox($Merror, "ftp-error", 'ftp-DirSetCurrent von "' & $MyFtpDir & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
_FTP_Close($ftpOpenHdl)
Exit
EndIf
ConsoleWrite('ftp-DirSetCurrent nach "' & $MyFtpDir & '" gelungen' & @CRLF)
; Zur Sicherheit nochmal abfragen
; Get Current Directory on an FTP server
$ftpCurrentDir = _FTP_DirGetCurrent($ftpConnect)
If @error > 0 Or $ftpCurrentDir == 0 Then
MsgBox($Merror, "ftp-error", 'ftp-DirGetCurrent von "' & $server & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
_FTP_Close($ftpOpenHdl)
Exit
EndIf
ConsoleWrite("ftp-DirGetCurrent: " & String($ftpCurrentDir) & @CRLF)
; Get names, sizes, attributes aand times of files/dir of current remote directory
$ftpListArray = _FTP_ListToArrayEx($ftpConnect, 0) ; 0 = Both Files and Directories, 1 = Directories, 2 = Files.
If (Not IsArray($ftpListArray)) Or $ftpListArray[0][0] = 0 Then
MsgBox($Merror, "ftp-error", 'ftp-ListToArrayEx von ' & $ftpCurrentDir & '" fehlgeschlagen!' & @CRLF & "Error: " & @error)
_FTP_Close($ftpOpenHdl)
Exit
EndIf
ConsoleWrite('Einträge: ' & $ftpListArray[0][0] & @CRLF)
ConsoleWrite(Array2DToString($ftpListArray, "|") & @CRLF)
_ArrayDisplay($ftpListArray, $server & ' - ' & $ftpCurrentDir)
EndFunc ;==>ftpListDir
; QuickHack: 2D-Array in String umwandeln
Func Array2DToString($2DArryMitZelle0, $delimiter = "|", $davor = " ")
Local $String
; ein Array?
If Not IsArray($2DArryMitZelle0) Then
ConsoleWrite(" -> kein Array!" & @CRLF)
Return ""
EndIf
; 2D-Array?
If UBound($2DArryMitZelle0, 0) <> 2 Then
ConsoleWrite(" -> kein 2D-Array!" & @CRLF)
Return ""
EndIf
For $r = 1 To UBound($2DArryMitZelle0, 1) - 1
; Vor jede Zeile
$String &= $davor
For $c = 0 To UBound($2DArryMitZelle0, 2) - 1
$String &= $2DArryMitZelle0[$r][$c] & $delimiter
Next
; letzten Delimiter wieder abschneiden
$String = StringTrimRight($String, StringLen($delimiter))
$String &= @CRLF
Next
Return $String
EndFunc ;==>Array2DToString
#EndRegion Functions
edit:
Es spielt auch keine Rolle, ob ich die momentane Final 3.3.8.1 oder die aktuelle Beta 3.3.9.22 verwende.
Ich weiß einfach nicht, wo der Fehler liegt. Rufe ich die Funktionen falsch auf oder ist da ein Bug in der UDF?
Besten Dank und weiterhin happy computing
R@iner