FTPEx-Problem - wo ist der Fehler?

  • 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
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Version=Beta
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

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

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

    ; ftp-Daten zum Setzen
    #Region VarToSet
    ; ftp-Server
    Global $server = 'service.avm.de'
    Global $username = ''
    Global $userpassword = ''
    #EndRegion VarToSet

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

    ; 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

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

    Global $return
    Global $return

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

    ; ftp-handle
    Global $ftpOpenHdl
    Global $ftpConnect
    #EndRegion internal vars

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

    ; --- 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

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

    ; 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)

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

    ; -- Ab hier gibt es 4 Testscenarien --
    $return = Number(InputBox("Welche Variante soll getestet werden?", "Varianten 1-5", 1, "", 350, 140))

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

    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')

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

    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')

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

    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')

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

    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')

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

    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!

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

    Case Else ; falsche Eingabe
    MsgBox($Merror, "Eingabefehler", 'Es sind nur Zahlen von 1-5 erlaubt und nicht "' & $return & '"')
    EndSwitch

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

    $return = _FTP_Close($ftpOpenHdl)
    If $return <> 1 Then
    MsgBox($Merror, "ftp-error", 'ftp-close von "' & $server & '" fehlgeschlagen!' & @CRLF)
    EndIf
    #EndRegion main

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

    ; --- 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

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

    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)

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

    ; 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)

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

    ; 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)

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

    ; 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

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

    ; QuickHack: 2D-Array in String umwandeln
    Func Array2DToString($2DArryMitZelle0, $delimiter = "|", $davor = " ")
    Local $String

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

    ; ein Array?
    If Not IsArray($2DArryMitZelle0) Then
    ConsoleWrite(" -> kein Array!" & @CRLF)
    Return ""
    EndIf

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

    ; 2D-Array?
    If UBound($2DArryMitZelle0, 0) <> 2 Then
    ConsoleWrite(" -> kein 2D-Array!" & @CRLF)
    Return ""
    EndIf

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

    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

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

    Return $String
    EndFunc ;==>Array2DToString
    #EndRegion Functions

    [/autoit]

    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

  • Hi,
    das kommt daher, weil du die Daten statt vom FTP-Server aus dessen oder deinem Cache holst...wohl der Fehler, den 99% aller FTP-User machen^^
    http://msdn.microsoft.com/en-us/library/…1(v=vs.85).aspx

    Mit

    [autoit]

    $ftpListArray = _FTP_ListToArrayEx($ftpConnect, 0,$INTERNET_FLAG_RELOAD)

    [/autoit]

    sollte es funktionieren...