[FTP] ganzer ordner Download (problem mit _FTPFilesListToArray)

  • Ich hoffe ihr könnt mir helfen !!

    Spoiler anzeigen
    [autoit]

    Func _down()
    FileDelete(@scriptdir & "\down")
    DirCreate(@scriptdir & "\down")
    $server = '*************'
    $username = '*******'
    $pass = '***********'
    $Open = _FTPOpen('MyFTP Control')
    $Conn = _FTPConnect($Open, $server, $username, $pass)
    $ftpfileslist = _FTPFilesListToArray($Conn) ; <== Da ist das problem da kommt nur mist raus!!!! |敢敦汨⹥硴t繁1⨀̀Ѐ㺾츼➁∾ᒒ <== das zb heist befehle.txt
    _ArrayDisplay($ftpfileslist)
    if IsArray($ftpfileslist)then
    For $i = 1 To $ftpfileslist[0]
    _FTPGetFile($Conn, $ftpfileslist[$i],@scriptdir & "\down\" & $ftpfileslist[$i])
    Next
    EndIf
    _FTPClose('Open')
    EndFunc

    [/autoit]


    mfg

    Buphx ;)

  • Hallo Buphx,

    pushen nach 7 Minuten ist sehr unhöflich und wird i.d.R. mit Missachtng bestraft, also etwas mehr Geduld bitte.

    Du solltest nach jedem _FTP_ -Befehl eine @Error Abfrage einbauen und den ErrorCode (falls einer auftritt) hier posten,

    mfg autoBert

  • hallo,
    ich hab mal einen download so realisiert!

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>
    #include <FTPEx.au3>
    #Include <File.au3>
    #Include <Array.au3>
    #include <Date.au3>
    #include <Process.au3>

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

    If Not FileExists (@ScriptDir & "\Temp") Then DirCreate (@ScriptDir & "\Temp")

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

    $Zielpfad = @ScriptDir & "\Temp\"

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

    $server = 'server'
    $username = 'user'
    $pass = '*********'

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

    $path = '/'

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

    $Open = _FTP_Open('server')
    $Conn = _FTP_Connect($Open, $server, $username, $pass, true)
    ;MsgBox(0,"",$Conn)
    $setdir = _Ftp_DirSetCurrent($Conn, $path)
    ;MsgBox(0,"set dir",$setdir)

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

    ;$Dirlist = _FTPFilesListToArray($Conn, 1)
    ;_ArrayDisplay($Dirlist, 'Directorys List')

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

    $Dirlist = _FTP_ListToArray2D($Conn, 2)
    ;MsgBox(0,"files vorhanden?",$Dirlist[0])
    ;_ArrayDisplay($Dirlist, 'File List')

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

    If $Dirlist[0][0] = 0 Then
    MsgBox(0,"", "keine Files vorhanden",1)
    Exit
    Else
    For $i = 1 To $Dirlist[0][0]
    ;MsgBox(0,"files ++++",$Dirlist[$i][0])
    IF $Dirlist[$i][1] = 0 Then ;prüfung auf fehler
    ;MsgBox(0,"files ++++",$Dirlist[$i][1])
    Else
    $left = StringLeft($Dirlist[$i][0], 6)
    $right = StringRight($Dirlist[$i][0], 4)
    ;MsgBox(0,"",$left & $right)

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

    IF $left = "agabda" And $right = ".dat" Then
    ;MsgBox(0,"",$Dirlist[$i][0])
    _FTP_FileGet($Conn, $Dirlist[$i][0], $Zielpfad & $Dirlist[$i][0]) ; lädt file vom ftp server
    Sleep(1000)
    _FTP_FileDelete($Conn, $Dirlist[$i][0]) ; löscht file vom ftp server
    Sleep(1000)
    ;_upload()
    Else
    ;MsgBox(0,"",$Dirlist[$i][0])
    _FileWriteLog(@ScriptDir & "\Temp\upload.log","Error - No dat File")
    EndIf
    EndIf
    Next
    EndIf

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

    _FTP_Close($Open)

    [/autoit]

    vielleicht hilft es dir ja weiter.

    gruß gmmg

  • versuche gerade das gleiche zu machen, gmmg, das habe ich mal getestet weil mein script nicht geht, weiß aber nicht woran es liegt, error ist:

    Zitat

    28 - Subscript used with non-Array variable

  • Bei der Hilfe zu [ offen ] Gesamten Ordner von FTP Server herunterladen ist Fliwatt auf das selbe Problem gestossen, ich nutze 3.3.6.1 er hat 3.3.8.1. Deshalb habe ich mit Bekannte Bugs in 3.3.8.1? nach Bugs gefragt und siehe da: _Ftp_ListToArray2D ist als buggy bestätigt worden. Du kannst jetzt entweder das Skript auf _Ftp_ListToArray anpassen oder mein Skript aus [ offen ] Gesamten Ordner von FTP Server herunterladen nehmen solltest allerdings die geänderte Version von _FTP_FileList_Rekursiv aus Post 20 verwenden,

    mfg autoBert

  • mein vorheriges Script war auf _FTP_ListToArray, deswegen habe ich mich gewundert warum das und _FTP_ListToArray2D beides nicht funktioniert :)
    gute sache sowas zu melden, hatte nicht genug zeit die aktuelle Threads anzuschauen, dankeschön

    wäre das so dann richtig?

    [autoit]

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

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

    ;If Not FileExists (@ScriptDir & "\Temp") Then DirCreate (@ScriptDir & "\Temp")

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

    $Zielpfad = @ScriptDir & "\Temp\"
    $path = @ScriptDir & "\"

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

    $server = ''
    $user = ''
    $pw = ''

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

    $Open = _FTP_Open('server')
    $l_FTPSession = _FTP_Connect($open, $server, $user, $pw, 1)

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

    $aResult = 'blabla'

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

    _FTP_FileList_Rekursiv($aResult, $server & "/")
    Func _FTP_FileList_Rekursiv(ByRef $aResult, $sPath, $bFolders = False)
    Local $aFiles, $aFolders
    If $sPath <> "" Then
    _FTP_DirSetCurrent($l_FTPSession, $sPath)
    $sPath = _FTP_DirGetCurrent($l_FTPSession)
    EndIf
    $aFiles = _Ftp_ListToArray($l_FTPSession, 2)
    If IsArray($aFiles) Then
    ;_ArrayDisplay($aFiles)
    If $aFiles[0] > 0 Then
    For $i = 1 To $aFiles[0]
    _ArrayAdd($aResult, $sPath & "/" & $aFiles[$i])
    ConsoleWrite("File: " & $sPath & "/" & $aFiles[$i] & @CRLF)
    Next
    EndIf
    EndIf
    $aFolders = _Ftp_ListToArray($l_FTPSession, 1)
    ;_ArrayDisplay($aFolders)
    If IsArray($aFolders) Then
    If $aFolders[0] > 0 Then
    For $i = 1 To $aFolders[0]
    If $aFolders[$i] <> '.' And $aFolders[$i] <> '..' Then
    ConsoleWrite("Folder: " & $sPath & "/" & $aFolders[$i] & @CRLF)
    If $bFolders Then _ArrayAdd($aResult, $sPath & "/" & $aFolders[$i])
    _FTP_FileList_Rekursiv($aResult, $sPath & "/" & $aFolders[$i], $bFolders)
    EndIf
    Next
    EndIf
    EndIf
    $aResult[0] = UBound($aResult) - 1
    EndFunc

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

    _ArrayDisplay($aResult)

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

    for $i = 1 to $aResult[0]
    _FTP_FileGet($l_FTPSession, $aResult[$i], $zielpfad & $aResult[$i])
    Next

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

    _FTP_Close($Open)

    [/autoit]

    Einmal editiert, zuletzt von Zattoo (8. April 2012 um 20:33)

  • wäre das so dann richtig?


    Nein, wie du sicher bemerkt hast, denn $aResult muss bereits ein Array sein. Du musst Zeile 16 ab ändern zu:

    [autoit]

    Global $aResult[1}

    [/autoit]

    wobeu es durch die Übergabe ByRef keine Rolle spielt ob Global, Local oder Dim verendet wird,

    mfg autoBert

  • [autoit]

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

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

    If Not FileExists (@ScriptDir & "\Temp") Then DirCreate (@ScriptDir & "\Temp")

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

    $Zielpfad = @ScriptDir & "\Temp\"
    $path = @ScriptDir & "\"

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

    $server = ''
    $user = ''
    $pw = ''

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

    $Open = _FTP_Open('server')
    $l_FTPSession = _FTP_Connect($open, $server, $user, $pw, 1)

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

    Global $aResult[1]

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

    _FTP_FileList_Rekursiv($aResult, $server & "/")
    Func _FTP_FileList_Rekursiv(ByRef $aResult, $sPath, $bFolders = False)
    Local $aFiles, $aFolders
    If $sPath <> "" Then
    _FTP_DirSetCurrent($l_FTPSession, $sPath)
    $sPath = _FTP_DirGetCurrent($l_FTPSession)
    EndIf
    $aFiles = _Ftp_ListToArray($l_FTPSession, 2)
    If IsArray($aFiles) Then
    ;_ArrayDisplay($aFiles)
    If $aFiles[0] > 0 Then
    For $i = 1 To $aFiles[0]
    _ArrayAdd($aResult, $sPath & "/" & $aFiles[$i])
    ConsoleWrite("File: " & $sPath & "/" & $aFiles[$i] & @CRLF)
    Next
    EndIf
    EndIf
    $aFolders = _Ftp_ListToArray($l_FTPSession, 1)
    ;_ArrayDisplay($aFolders)
    If IsArray($aFolders) Then
    If $aFolders[0] > 0 Then
    For $i = 1 To $aFolders[0]
    If $aFolders[$i] <> '.' And $aFolders[$i] <> '..' Then
    ConsoleWrite("Folder: " & $sPath & "/" & $aFolders[$i] & @CRLF)
    If $bFolders Then _ArrayAdd($aResult, $sPath & "/" & $aFolders[$i])
    _FTP_FileList_Rekursiv($aResult, $sPath & "/" & $aFolders[$i], $bFolders)
    EndIf
    Next
    EndIf
    EndIf
    $aResult[0] = UBound($aResult) - 1
    EndFunc

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

    for $i = 1 to $aResult[0]
    _FTP_FileGet($l_FTPSession, $aResult[$i], $zielpfad & $aResult[$i])
    Next

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

    _FTP_Close($Open)

    [/autoit]

    es wird hier zwar alles in der console aufgelistet, aber er downloadest nicht :/

  • Hallo Zattoo,

    du hast vergessen die Routine _createLocalDirIfNecessary zu verwenden, aber zumindest die Dateien im FTP-Rootverzeichnis hätte er herunterladen müssen.

    Edit: ich weise dich darauf hin, dass ich es dir nicht gestatte aus von mir geschriebenen Routinen den Funktionskopf zu entfernen

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (9. April 2012 um 12:52)

  • in meinem script habe ich die routine drin (dann weiß ich auch immer was was ist), nur hier nicht weil das dann immer so riesig ist :) werde es dann in zukunft mitposten
    ...hätte er herunterladen müssen... <- dh da ist etwas falsch?

  • ...hätte er herunterladen müssen... <- dh da ist etwas falsch?

    ich weis nicht wie dein Root-Verzeichnis ausschaut, wenn sich darin nur Ordner befinden ist dies fürdas Rootverzeichnis in Ordnung. Aber noch einmal:

    du hast vergessen die Routine _createLocalDirIfNecessary zu verwenden, aber zumindest die Dateien im FTP-Rootverzeichnis hätte er herunterladen müssen.

    d.h. für die Dateien die sich in Ordnern (oder deren Unterordner) des Roots befinden ist es ein Fehler, der verursacht wird durch Fehlen und verwenden von _createLocalDirIfNecessary. Wie man an der Funktionsbeschreibung:

    erkennen kann ist diese Func dafür zuständig vor dem Download zu prüfem ob die (lokale) Verzeichnisstruktur besteht denn ohne ein existierendes Zielverzeichnis muss _FTP_FileGet scheitern. In [Beispiel] FTP-Downloader (rekursiv mit allen Unterverzeichnissen) habe ich auch Dateien angehängt, die auch unter 3.3.8.1 (welches du anscheindend benutzt) laufen. Du benötigst die beiden Dateien mit WA am Ende. Starte die Demo im Originalzustand und du siehst dass es funktioniert, plane etwas Zeit ein denn es sind afair > 1 GB die heruntergeladen werden . Sollte wieder Erwarten ein Fehler kommen, poste bitte dort die Ausgabe deiner Scitekonsole, Danach trägst du die Zugangsdaten zu deinem Server und deine Pfade ein und testet es mit deinem Webspace, auch hier gilt Fehlermeldungen einstellen si denn welche kommen,

    mfg autoBert

    mfg autoBert