FTP Dateien auslesen

  • [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <ftp.au3>
    #Include <Date.au3>

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

    $title = GUICreate("FastTransfer", 658, 443, 192, 124)
    $menu1 = GUICtrlCreateMenu("Datei")
    $menu11 = GUICtrlCreateMenuitem("New Connection", $menu1)
    $menu12 = GUICtrlCreateMenuitem("Close Connection", $menu1)
    $menu13 = GUICtrlCreateMenuitem("Servermanager", $menu1)
    $menu14 = GUICtrlCreateMenuitem("Exit", $menu1)
    $menu2 = GUICtrlCreateMenu("Other")
    $menu21 = GUICtrlCreateMenuitem("About", $menu2)
    $server_l = GUICtrlCreateLabel("Server:", 8, 8, 38, 19)
    $username_l = GUICtrlCreateLabel("Username:", 176, 8, 55, 19)
    $password_l = GUICtrlCreateLabel("Password:", 360, 8, 53, 19)
    $server_i = GUICtrlCreateInput("", 48, 8, 121, 21)
    $username_i = GUICtrlCreateInput("", 232, 8, 121, 21)
    $password_i = GUICtrlCreateInput("", 416, 8, 121, 21)
    $connect = GUICtrlCreateButton("Connect", 544, 8, 105, 25, $WS_GROUP)
    $dateieneigen = GUICtrlCreateList("", 8, 80, 641, 136)
    $dateienserver = GUICtrlCreateList("", 8, 230, 641, 136)
    $toolname = "FastTransfer"
    $open = _FTPOpen($toolname)
    $server = " "
    $username = " "
    $password = " "
    $uhrzeit = @Hour & ":" & @Min & ":" & @Sec & " "
    $connection = _FTPConnect($open,$server,$username,$password)
    DirCreate("Logs")
    $log = "Logs\" & _NowDate() & ".txt"
    FileOpen($log, 1)
    FileWriteLine($log, $uhrzeit & $toolname & " wurde gestartet. "& @CRLF)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $uhrzeit = @Hour & ":" & @Min & ":" & @Sec & " "
    $server = GUICTRLRead($server_i)
    $username = GUICTRLRead($username_i)
    $password = GUICTRLRead($password_i)

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $menu14
    _FTPClose($connection)
    FileWriteLine($log, $uhrzeit & $toolname & " wurde beendet. "& @CRLF)
    MSGBOX(1, "Exit", "Vielen Dank, dass sie " & $toolname & " genutzt haben.")
    Exit

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

    Case $menu12
    FileWriteLine($log, $uhrzeit & "Verbindung zu " & $server & " wurde getrennt." & @CRLF)
    _FTPClose($connection)
    GUICtrlSetData($server_i,"")
    GUICtrlSetData($username_i,"")
    GUICtrlSetData($password_i,"")

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

    Case $connect
    if($server = "" or $username = "" or $password = "") Then
    MSGBOX(1, "Error", "Server, Username oder Password wurde nicht angegeben.")
    FileWriteLine($log, $uhrzeit & "Server, Username oder Password wurde nicht angegeben." & @CRLF)
    Else
    _FTPConnect($open,$server,$username,$password)
    if(@error) Then
    FileWriteLine($log, $uhrzeit & "Bei der Verbindung zu " & $server & " trat ein Fehler auf." & @CRLF)
    Else
    FileWriteLine($log, $uhrzeit & "Verbindung erfolgreich hergestellt zu " & $server & @CRLF)
    EndIf
    $filelist = _FtpFilesListtoArray($connection,0)
    For $i = 1 to UBound ($filelist) -1
    GUICtrlSetData ($dateienserver[$i], $filelist [$i][0]&"|")
    ConsoleWrite($filelist[$i] & @CRLF)
    Next
    EndIf

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

    Case $GUI_EVENT_CLOSE
    _FTPClose($connection)
    FileWriteLine($log, $uhrzeit & $toolname & " wurde beendet. "& @CRLF)
    Exit

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

    EndSwitch
    WEnd

    [/autoit]


    Meine Loginfunktion funktioniert. NUr ich krieg die Dateiausgabe von dem FTP Server nicht hin :(
    Wäre echt nett :)


    Schrubber

  • Ich habe keine Funktion der Art gefunden. Aber ich lasse mich gerne eines besseren belehren :)


    [autoit]

    _FtpFileListto2DArray()

    [/autoit]

    Funktioniert bei mir nicht..... Schau mein Script an....

    Einmal editiert, zuletzt von Rubberducky (22. November 2009 um 22:50)

  • Hi,

    ich hab mir da nochwas drumgebaut

    Spoiler anzeigen
    [autoit]

    Func _OpenFTP($server, $username = "", $pass = "")
    If $FTPOpen = 0 Then $FTPOpen = _FTPOpen ('AutoIt v3')
    If Not @error Then
    If $FTPConn = 0 Then $FTPConn = _FTPConnect ($FTPOpen, $server, $username, $pass, True)
    If Not @error Then
    Return 1
    Else
    SetError(1)
    Return 0
    EndIf
    Else
    SetError(1)
    Return 0
    EndIf
    Return 0
    EndFunc ;==>_OpenFTP

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

    Func _CloseFTP()
    If Not $FTPConn = 0 Then
    _FTPClose ($FTPConn)
    $FTPConn = 0
    EndIf
    If Not $FTPOpen = 0 Then
    _FTPClose ($FTPOpen)
    $FTPOpen = 0
    EndIf
    Return 1
    EndFunc ;==>_CloseFTP

    [/autoit]

    ich hatte auch schwirigkeiten mit dem Connect ..... aber hiermit gings dann,
    die Func kannst du immer ausfrüfen, es wird nur eine Verbindung geöffnet.
    $FTPConn noch Global declarieren

    Local $Dirlist = _FTPFilesListToArray ($FTPConn, 1)

  • Irgendwie gefällt mir meine Art besser :)
    Nicht böse sein, speicher mir deine Lösung zur Vorsicht mal ab, aber nun hab ich eine neue Frage:


    [autoit]

    Case $connect
    if($server = "" or $username = "" or $password = "") Then
    MSGBOX(1, "Error", "Server, Username oder Password wurde nicht angegeben.")
    FileWriteLine($log, $uhrzeit & "Server, Username oder Password wurde nicht angegeben." & @CRLF)
    Else
    _FTPConnect($open,$server,$username,$password)
    if(@error) Then
    FileWriteLine($log, $uhrzeit & "Bei der Verbindung zu " & $server & " trat ein Fehler auf." & @CRLF)
    Else
    FileWriteLine($log, $uhrzeit & "Verbindung erfolgreich hergestellt zu " & $server & @CRLF)
    EndIf
    EndIf

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

    Local $dirlist = _FTPFilesListToArray ($connection)
    FileWriteLine($log, $uhrzeit & "Testeintrag nach $dirlist" & @CRLF)
    For $i = 1 to UBound ($dirlist) -1
    FileWriteLine($log, $uhrzeit & "Testeintrag nach For-Schleifenbeginn" & @CRLF)
    GUICtrlSetData ($dateienserver[$i], $dirlist[$i]&"|")
    FileWriteLine($log, $uhrzeit & "Testeintrag nach Listeneintrag" & @CRLF)
    Next

    [/autoit]

    Auszug aus der Logdatei:

    Zitat

    00:03:27 FastTransfer wurde gestartet.
    00:03:31 Verbindung erfolgreich hergestellt zu ZENSIERT
    00:03:31 Testeintrag nach $dirlist

    Also schafft er das For $i = 1 to UBound nicht. Warum? :(


    Schrubber

  • [autoit]

    $dirlist = _FTPFilesListTo2DArray ($connection,0,0x80000000)

    [/autoit]

    Probiere das mal, mit dem so angegebenen 3. Parameter werden die Daten nicht aus dem Cache gelesen, sondern direkt vom Server angefordert. Bei Änderungen von Daten auf dem Server hat man so immer den aktuellen Stand.

    Zitat

    Also schafft er das For $i = 1 to UBound nicht. Warum?

    Weil du weder Fehler richtig abfragst noch richtig auswertest!

    [autoit]

    _FTPConnect($open,$server,$username,$password)

    [/autoit]

    Connectet und gibt dir einen Identifier zurück der aber nicht in eine Variable geschrieben wird......In der nächsten Zeile könntest du das abfangen, aber

    [autoit]

    if(@error) Then

    [/autoit]

    bringt nix, weil ....._FTPConnect() bei Erfolg ja keinen Fehler ausgibt.....
    Da du auch wahrscheinlich kein

    [autoit]


    Opt("MustDeclareVars", 1)

    [/autoit]

    in deinem Script hast (ansonsten hätte es eine Fehlermeldung wegen der noch nicht definierten Variable $connection bei _FTPFilesListToArray($connection) gegeben ;) ) , würde ich das nachholen.

    so sollte es hinhauen:

    [autoit]

    #include <FTP_Ex.au3>

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

    Case $connect
    If ($server = "" Or $username = "" Or $password = "") Then
    MsgBox(1, "Error", "Server, Username oder Password wurde nicht angegeben.")
    FileWriteLine($log, $uhrzeit & "Server, Username oder Password wurde nicht angegeben." & @CRLF)
    Else
    $connection = _FTPConnect($open, $server, $username, $password)
    If $connect = 0 Then
    FileWriteLine($log, $uhrzeit & "Bei der Verbindung zu " & $server & " trat der Fehler Nummer " & @error & " auf." & @CRLF)
    Else
    FileWriteLine($log, $uhrzeit & "Verbindung erfolgreich hergestellt zu " & $server & @CRLF)
    EndIf
    EndIf

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

    Local $dirlist = _FTPFilesListToArray($connection,0,0x80000000)
    If IsArray($dirlist) Then ;nur wenn Dateien/verzeichnisse gelesen wurden
    FileWriteLine($log, $uhrzeit & "Testeintrag nach $dirlist" & @CRLF)
    For $i = 1 To UBound($dirlist) - 1
    FileWriteLine($log, $uhrzeit & "Testeintrag nach For-Schleifenbeginn" & @CRLF)
    GUICtrlSetData($dateienserver[$i], $dirlist[$i] & "|")
    FileWriteLine($log, $uhrzeit & "Testeintrag nach Listeneintrag" & @CRLF)
    Next
    Else
    FileWriteLine($log, $uhrzeit & "Daten im angegebenen Verzeichnis nicht lesbar" & @CRLF)
    EndIf

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

    Wenn du Informationen zu den Rückgabewerten der Funktionen haben willst, dann schau sie dir doch einfach an! In Scite den Cursor auf den Funktionsnamen und dann CTRL+j und schon bist du in der UDF an der richtigen Stelle....mit CTRL+SHIFT+j gehts wieder zurück ins Script.
    Alternativ können Mausschubser auch im Extras-Menü nach "Jump to Function Prod" manövrieren und da draufklicken.

  • Ouh, das tat weh :o

    Nun seh ich erstmal, was ich alles falsch gemacht hab / falsch verstandne habe o.o

    Ich kriege nun nur noch den Fehler:

    Zitat

    D:\AutoIt3\Eigen\Scripts\FastTransfer.au3 (88) : ==> Subscript used with non-Array variable.:
    GUICtrlSetData($dateienserver[$i], $dirlist[$i] & "|")
    GUICtrlSetData($dateienserver^ ERROR

    Ich schätz mal, ich muss $dateienserver erstmal als Array deklarieren.
    Aber das sollte ich nun selber schaffen,


    Danke euch :)