Probleme mit _FTP_FindFile...

  • Hi, ich bins mal wieder ^^
    Diesmal mit einem andern problem. (Ich weis, langsam nervts ^^)

    Hier mal der Code:

    Spoiler anzeigen
    [autoit]


    ;===========================================================================> Includes
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <FTPEx.au3>
    #Include <GuiListView.au3>
    ;===========================================================================> Globals
    Global $FTP_Name = "ftp-web.funpic.de"
    Global $FTP_User = "ftpXXXXXXX"
    Global $FTP_Pass = "XXXXXXXXXXXXX"
    Global $FTPOpen = _FTP_Open ("QuizMaster")
    Global $FTP_Dir = "quiz/"
    Global $FTPConnect
    Global $List1
    _Load ()
    ;===========================================================================> Func _Start / GUI = LoadGUI
    Func _Load ()
    $LoadGUI = GUICreate("QuizMaster Client v1.0", 601, 394, 193, 150)
    GUISetFont(9, 800, 0, "Arial")
    GUISetBkColor(0xA6CAF0)
    GUICtrlCreateLabel("QuizMaster", 0, 0, 600, 115, BitOR($SS_CENTER,$SS_SUNKEN,$WS_BORDER,$WS_CLIPSIBLINGS), $WS_EX_CLIENTEDGE)
    GUICtrlSetFont(-1, 72, 800, 0, "Arial")
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    GUICtrlCreateLabel("v1.0.0", 8, 96, 37, 19)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $List1 = GUICtrlCreateListView("", 0, 115, 600, 231, BitOR($GUI_SS_DEFAULT_LIST,$WS_HSCROLL))
    $Button1 = GUICtrlCreateButton("Aktualisieren", 8, 352, 115, 25)
    $Button2 = GUICtrlCreateButton("Quiz öffnen", 128, 352, 115, 25)
    GUISetState(@SW_SHOW)
    ;===========================================================================> While GUI = LoadGUI
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $FTPConnect = _FTP_Connect ($FTPOpen, $FTP_Name, $FTP_User, $FTP_Pass)
    MsgBox (16, "Verbindung fehlgeschlagen - Fehlermeldung: " & @error, "Es konnte keine Verbindung mit dem Server hergestellt werden!" & @CRLF & _
    "Bitte versuchen Sie es später erneut oder setzen Sie sich mit dem Admin in verbindung." & @CRLF & @CRLF & _
    "Danke.")
    Local $Handle
    $Find = _FTP_FindFileFirst ($FTPConnect, $FTP_Dir, $Handle)
    If @error Then MsgBox (16, "", @error)
    MsgBox (0, "", $Find[10])
    For $i = 1 to $Find[0] Step 1
    $Find = _FTP_FindFileNext ($Handle)
    MsgBox (0, "", $Find[10])
    Next
    _FTP_FindFileClose ($Handle)
    _FTP_Close ($FTPOpen)
    EndSwitch
    WEnd
    EndFunc
    ;===========================================================================>

    [/autoit]

    Hier werden 11 Dateien gefunden, obwohl nur 3 Dateien auf dem Server sind.
    Deshalb bricht er in der For-Next schleife auf nach der 3ten Datei ab.

    Jemand eine Lösung?

    MfG
    Commander21

  • Der Wert im ersten Element des zurückgegebenen Arrays ist nicht die Anzahl der Elemente ;). Das ist die Anzahl der Elemente im Array (und die ist immer 11 wenn die Funktion erfolgreich ist) ^^.
    Die Anzahl der Dateien erfährst du erst, nachdem du alle Dateien mit FindFileNext durchgegangen bist und die Funktion @error setzt. Das ist auch bei der lokalen Version FileFindFirst/NextFile so ;).

  • Und wie bekomme ich dann die Anzahl der Dateien auf dem Server, bzw. im Ordner raus?
    Die Anzahl variiert ja, also muss ich für die For-Next Schleife definiern wieviele Dateien es insg. sind.

  • Das versteh ich grad nicht ganz.Ich brauche doch für die Schleife die anzahl der dateien, damit sie weis
    wie oft sie _FTP_FindFileNext einsetzen muss oder nicht?

  • Nö, wenn du eine Endlosschleife benutzt, die du abbrichst wenn @error gesetzt wird nachdem _FTP_FindFileNext ausgeührt wurde, dann wird _FTP_FindFileFirst nur einmal mehr ausgeführt als du Dateien hast. Nachdem die Schleife abgebrochen wurde, hast du auch die Anzahl der Dateien in dem Pfad.

  • Ok, ich versuchs mal :) Danke

    Edit:
    So, jetz klappt es so halbwegs.

    Spoiler anzeigen
    [autoit]


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $FTPConnect = _FTP_Connect ($FTPOpen, $FTP_Name, $FTP_User, $FTP_Pass)
    If @error Then MsgBox (16, "Verbindung fehlgeschlagen - Fehlermeldung: " & @error, "Es konnte keine Verbindung mit dem Server hergestellt werden!" & @CRLF & _
    "Bitte versuchen Sie es später erneut oder setzen Sie sich mit dem Admin in verbindung." & @CRLF & @CRLF & _
    "Danke.")
    Local $Handle
    $Find = _FTP_FindFileFirst ($FTPConnect, $FTP_Dir, $Handle)
    Do
    _GUICtrlListBox_AddString ($List1, $Find[10])
    $Find = _FTP_FindFileNext ($Handle)
    Until @error
    _FTP_FindFileClose ($Handle)
    _FTP_Close ($FTPOpen)
    EndSwitch
    WEnd

    [/autoit]


    Aber sobald ich die funktion, also "Aktualisieren" erneut aufrufe heist es:

    Zitat


    .................. (47) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    _GUICtrlListBox_AddString ($List1, $Find[10])
    _GUICtrlListBox_AddString ($List1, ^ ERROR

  • Du musst natürlich beachten, dass _FTP_FindFileNext kein Array zurückgibt wenn keine Datei mehr im Verzeichnis gefunden wird. Wenn du dann versuchst $Find als ein Array anzusprechen, dann gibt dir AutoIt einen Error aus, weil $Find einfach kein Array ist.

  • Ups... Da hab ich wohl eine Kleinigkeit übersehen ^^. $Find ist zwar kein Array, aber das liegt nicht daran, dass FindFileNext keine Datei mehr findet.
    In Zeile 18, nachdem der Vorgang abgeschlossen ist, beendest du die ganze FTP Session. Die wird aber nirgendwo erneut gestartet und somit schlägt ab diesem Punkt die Funktion fehl.
    Versuche entweder mal die Session bei jedem Klick auf den Button neu zu starten, oder einmal am Anfang des Scripts zu starten und dann erst am Ende wieder zu beenden.

  • OMG Das ist es xD
    So ein winziger Fehler und ich finde ihn beim 100ten mal drüber gucken net xD

    Vielen Dank, jetz kann ich endlich weiter machen ^^