_FTP_FileGet lädt nicht fertig

  • Hallo zusammen,

    Ich hoff' ihr könnt mir helfen. Ich habe ein kleines Tool, welches mir, je nach Einstellung in der ini, Dateien hoch und runterlädt - und noch ein bisschen Beigemüse.

    Ich mach folgendes:

    Spoiler anzeigen
    [autoit]


    ;~ *****Hier wird die Verbindung aufgebaut
    $Open = _FTP_Open('Open')
    $Conn = _FTP_Connect($Open, $server, $username, $pass);

    ...

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

    ElseIf $Direction = 'down' Then
    ConsoleWrite('*****DOWNLOAD*****'&@CRLF) ; hab ich nur für mich reingemacht
    ConsoleWrite(_FTP_DirGetCurrent($Conn)&@CRLF) ; hab ich nur für mich reingemacht

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

    $FileArray = _Ftp_ListToArray($Conn)
    _ArrayDisplay($FileArray) ; hier möchte ich eigentlich sehen was oben steht, is' aber leer

    _FTP_FileGet($Conn,'test.txt',$LocalDir&'test.txt') ; dies geht "fast"
    ...

    [/autoit]

    Zwei Probleme. Ich denke wenn ich das eine hab gehts auch mit dem anderen. Auf jeden Fall ist es so, dass das $FileArray leer ist, obwohl einige Files auf dem FTP da wären.
    Das zweite ist, dass wenn ich mit fileget das File runterlade, ich es kurzzeitig sehe und wenn das Skript fertig ist, verschwindet die Datei :wacko:

    Virenscanner ist ausgeschaltet (falls jemand meint es sei dieser ;) )
    Backslashes und Slashes sind's auch nicht, hab ich schon alles versucht.

    Ich danke für die Unterstützung
    LG
    nico

  • hallo autoBert

    also hier mal mein komplettes Skript

    Spoiler anzeigen
    [autoit]


    ;~ *****************************************
    ;~ FTP Sync
    ;~ *****************************************

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

    #include 'ftpex.au3'
    #include<fileList.au3>
    #include<Array.au3>
    #include<Inet.au3>
    #include<mail.au3>
    $file = FileOpen (@ScriptDir & "\log.txt", 1)
    $inifile = @ScriptDir&'\settings.ini'

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

    ;~ Hier werden Basisvariablen gesetzt
    $server = IniRead($inifile,'Parameters','Server','')
    $username = IniRead($inifile,'Parameters','Username','')
    $pass = IniRead($inifile,'Parameters','Password','')
    $RemoteDir = IniRead($inifile,'Parameters','RemoteDir','')
    $LocalDir = IniRead($inifile,'Parameters','LocalDir','')
    $JobName = IniRead($inifile,'Parameters','JobName','')
    $History = IniRead($inifile,'Parameters','History','no')
    $HistoryDir = IniRead($inifile,'Parameters','HistoryDir','')
    $Direction = IniRead($inifile,'Parameters','Direction','up')
    $DeleteSrc = IniRead($inifile,'Parameters','DeleteSrc','no')
    $Deletebefore = IniRead($inifile,'Parameters','Deletebefore','no')
    $SpezDirCount = IniRead($inifile,'SpezDir','Count','0')
    $SetPrefix = IniRead($inifile,'Parameters','SetPrefix','no')
    $FilePattern = IniRead($inifile,'Parameters','FilePattern','*')
    $ErrorMail = IniRead($inifile,'Parameters','ErrorMail','yes')
    $ErrMailAdr = IniRead($inifile,'Parameters','ErrMailAddress','*****@*****.ch')
    $NotiIfNoFileUp = IniRead($inifile,'Parameters','NotifyIfNoFileUp','no')
    $NotiIfNoFileDown = IniRead($inifile,'Parameters','NotifyIfNoFileDown','no')
    $ErrorDir = IniRead($inifile,'Parameters','error','')

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

    ;~ ***** Spezielle Dirs
    $errormsg = ''
    dim $SpezDir[$SpezDirCount+1]
    dim $SpezDirVar[$SpezDirCount+1]
    dim $SpezDirLoc[$SpezDirCount+1]
    if $SpezDirCount > 0 Then
    for $y=0 to $SpezDirCount Step 1
    $SpezDir[$y] = IniRead($inifile,'SpezDir','Dir'&$y,'')
    $SpezDirVar[$y] = IniRead($inifile,'SpezDir','Var'&$y,'')
    $SpezDirLoc[$y] = IniRead($inifile,'SpezDir','DirL'&$y,'')
    Next
    EndIf

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

    ;~ *****Hier wird die Verbindung aufgebaut
    $Open = _FTP_Open('Open')
    $Conn = _FTP_Connect($Open, $server, $username, $pass);

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

    ;~ ***** Log Datei schreiben
    FileWriteLine($file,'_______________________________________________________________________');
    FileWriteLine($file,@MDAY&'.'&@MON&'.'&@YEAR&' '&@HOUR&':'&@MIN);
    FileWriteLine($file,'Server: '&$server);
    FileWriteLine($file,'Nach->: '&$RemoteDir);
    $Ftpp = 0

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

    ;~ ***** Files abarbeiten

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

    ;~ ***** UPLOAD *****
    if $Direction = 'up' then
    FileWriteLine($file,'Hochgeladene Dateien:');
    $FileArray = StringSplit("","")
    $FileArray = _FileListToArrayRecursive($LocalDir,$FilePattern,1)
    if $FileArray[0] == 0 Then
    if $NotiIfNoFileUp == 'yes' Then
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 1'&$JobName, _
    'Der Job '&$JobName&' hat keine Files zum Hochladen <br>' _
    &$LocalDir& _
    '<br>Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '*****', _
    '**********')
    EndIf
    EndIf
    ;~ _ArrayDisplay($FileArray)

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

    For $i = 0 To $FileArray[0]
    if $SpezDirCount > 0 Then
    ;~ ***** Spezial Ordner *****
    for $y=0 to $SpezDirCount Step 1
    if StringInStr($FileArray[$i],$SpezDirVar[$y],2,1) > 0 Then
    if not FileExists($ErrorDir&$FileArray[$i]) Then
    $Ftpp = _FTP_FilePut($Conn,$LocalDir&$FileArray[$i],$RemoteDir&$SpezDir[$y]&$FileArray[$i])
    Else
    $errormsg = 'Datei kann nicht verschoben werden!<br>'
    EndIf
    if $Ftpp == 1 Then
    FileWriteLine($file,' - '&$FileArray[$i]);
    if $History == 'yes' Then
    if $HistoryDir <> '' then
    if Not FileMove($LocalDir&$FileArray[$i],$HistoryDir&$FileArray[$i]) Then
    FileCopy($LocalDir&$FileArray[$i],$HistoryDir&$FileArray[$i])
    if not FileDelete($LocalDir&$FileArray[$i]) Then
    if $ErrorDir <> '' Then
    FileCopy($LocalDir&$FileArray[$i],$ErrorDir&$FileArray[$i])
    EndIf
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 2 '&$JobName, _
    'Der Job '&$JobName&' hat eine Datei ('&$LocalDir&$FileArray[$i]&') nicht löschen können. <br> Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    EndIf
    EndIf
    EndIf
    EndIf
    Else
    FileWriteLine($file,@TAB&$LocalDir&$FileArray[$i]&@TAB&' -> '&@TAB&$RemoteDir&$SpezDir[$y]&$FileArray[$i]&@TAB&' = nicht funktioniert1!! ErrorCode: '&@error);
    if $ErrorMail == 'yes' Then
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 3 '&$JobName, _
    'Der Job '&$JobName&' hat anscheinend nicht funktioniert. <br>' _
    & $errormsg &$LocalDir&$FileArray[$i]&@TAB&' -> '&@TAB&$RemoteDir&$SpezDir[$y]&$FileArray[$i]&@TAB& _
    '<br>Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    EndIf
    EndIf
    EndIf
    next
    Elseif FileExists($LocalDir&$FileArray[$i]) then
    ;~ ***** Normale Ordner *****
    if not FileExists($ErrorDir&$FileArray[$i]) Then
    $Ftpp = _FTP_FilePut($Conn,$LocalDir&$FileArray[$i],$RemoteDir&$FileArray[$i])
    Else
    $errormsg = 'Datei kann nicht verschoben werden!<br>'
    EndIf

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

    if $Ftpp == 1 Then
    FileWriteLine($file,' - '&$FileArray[$i]);
    if $HistoryDir <> '' then
    if Not FileMove($LocalDir&$FileArray[$i],$HistoryDir&$FileArray[$i]) Then
    FileCopy($LocalDir&$FileArray[$i],$HistoryDir&$FileArray[$i])
    if not FileDelete($LocalDir&$FileArray[$i]) Then
    if $ErrorDir <> '' Then
    FileCopy($LocalDir&$FileArray[$i],$ErrorDir&$FileArray[$i])
    EndIf
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 4 '&$JobName, _
    'Der Job '&$JobName&' hat eine Datei ('&$LocalDir&$FileArray[$i]&') nicht löschen können. <br> Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    EndIf
    EndIf
    EndIf
    Else
    FileWriteLine($file,@TAB&$LocalDir&$FileArray[$i]&@TAB&' -> '&@TAB&$RemoteDir&$FileArray[$i]&@TAB&' = nicht funktioniert2!! ErrorCode: '&@error);
    if $ErrorMail == 'yes' Then
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 5 '&$JobName, _
    'Der Job '&$JobName&' hat anscheinend nicht funktioniert. <br>' _
    & $errormsg & $LocalDir&$FileArray[$i]&@TAB&' -> '&@TAB&$RemoteDir&$FileArray[$i]&@TAB& _
    '<br>Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    EndIf
    EndIf
    Else
    ConsoleWrite($LocalDir&$FileArray[$i])
    EndIf
    Next
    for $u=0 to $SpezDirCount Step 1
    if $SpezDirLoc[$u] <> '' then
    $FileArray = _FileListToArrayRecursive($SpezDirLoc[$u],$FilePattern,1)

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

    For $i = 0 To $FileArray[0]
    if StringInStr($FileArray[$i],$SpezDirVar[$u],2,1) > 0 Then
    $Ftpp = _FTP_FilePut($Conn,$SpezDirLoc[$u]&$FileArray[$i],$RemoteDir&$SpezDir[$u]&$FileArray[$i])

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

    if $Ftpp == 1 Then
    FileWriteLine($file,$u&' - '&$FileArray[$i]);
    if $History == 'yes' Then
    if $HistoryDir <> '' then
    if Not FileMove($SpezDirLoc[$u]&$FileArray[$i],$HistoryDir&$FileArray[$i]) Then
    FileCopy($SpezDirLoc[$u]&$FileArray[$i],$HistoryDir&$FileArray[$i])
    if not FileDelete($SpezDirLoc[$u]&$FileArray[$i]) Then
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 6 '&$JobName, _
    'Der Job '&$JobName&' hat eine Datei ('&$LocalDir&$FileArray[$i]&') nicht löschen können. <br> Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    EndIf
    EndIf
    EndIf
    EndIf
    Else
    FileWriteLine($file,@TAB&$SpezDirLoc[$u]&$FileArray[$i]&@TAB&' -> '&@TAB&$RemoteDir&$SpezDir[$u]&$FileArray[$i]&@TAB&' => nicht funktioniert3!! ErrorCode: '&@error);
    if $ErrorMail == 'yes' Then
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 7 '&$JobName, _
    'Der Job '&$JobName&' hat anscheinend nicht funktioniert. <br> Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    EndIf
    EndIf
    EndIf
    Next
    EndIf
    Next

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

    ;~ **** DOWNLOAD *****
    ElseIf $Direction = 'down' Then
    ConsoleWrite('*****DOWNLOAD*****'&@CRLF)
    $FileArray = _Ftp_ListToArray($Conn)
    ConsoleWrite(_FTP_DirGetCurrent($Conn)&@CRLF)
    _ArrayDisplay($FileArray)
    _FTP_FileGet($Conn,'index.php',$LocalDir&'test.txt');

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

    if IsArray($FileArray) Then
    ConsoleWrite($FileArray[0][0])
    For $i = 1 To $FileArray[0][0]
    if ($FileArray[$i][0] <> '.') and ($FileArray[$i][0] <> '..') then
    if $SetPrefix == 'yes' Then
    $prefix = 't_'&@MDAY&@MON&@HOUR&@MIN
    Else
    $prefix = ''
    EndIf

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

    _FTP_FileRename($Conn,$FileArray[$i][0],$prefix&$FileArray[$i][0])
    $Ftpp = _FTP_FileGet($Conn,$prefix&$FileArray[$i][0],$LocalDir&$prefix&$FileArray[$i][0]);

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

    if $Ftpp == 1 Then
    FileWriteLine($file,' - '&$prefix&$FileArray[$i][0]);
    if $DeleteSrc == 'yes' Then
    _FTP_FileDelete($Conn,$prefix&$FileArray[$i][0])
    EndIf
    Else
    FileWriteLine($file,' - '&$prefix&$FileArray[$i][0]&' <= hat nicht funktioniert!! ErrorCode: '&@error);
    EndIf
    EndIf
    Next
    else
    if $NotiIfNoFileDown == 'yes' Then
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 8'&$JobName, _
    'Der Job '&$JobName&' hat keine Files zum Herunterladen <br>' _
    &$LocalDir& _
    '<br>Datum: '&@MDAY&'.'&@MON&'.'&@YEAR&'<br>Zeit: '&@HOUR&':'&@MIN&'<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    EndIf
    EndIf
    EndIf
    ;~ Verbindung wird geschlossen
    $Ftpc = _FTP_Close($Open)
    FileWriteLine($file,'------------------------------------[ENDE]-----------------------------');
    FileClose($file);

    [/autoit]

    Danke für die Hilfe :)
    LG
    nico44

  • Hallo teacher1

    die Dateien bewegen sich von 2KB bis 3MB. Ich habe testeshalber auch Dateien mit 1KB und weniger (sprich ein leeres txt) versucht.

    Danke und Gruss
    nico44

  • Hallo nico44,

    dein Skript ist nicht lauffähig. Selbst nach anpassen der fehlenden Funktionen: _INetSmtpMailcom und _FileListToArrayRecursive erhalte ich folgende Fehlermeldung:

    Code
    D:\Programme\AutoIt3\ftptest.au3 (278) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    ConsoleWrite($FileArray[0][0])
    ConsoleWrite(^ ERROR

    welche auch absolit korrekt ist, da

    [autoit]

    _Ftp_ListToArray

    [/autoit]

    ein 1D-Array zurückliefert du aber von einem 2D-Array ausgehst.

    Im Moment streikt wieder einmal der FTP-Dienst bei meinem Webspace anbieter, so dass ich nicht weiter testen kann. Da du aber das downzuloadende File unmittelbar vor dem Download umbenennst könnte ich mir vorstellen es hat etwas damit zu tun,

    mfg autoBert

  • Hallo,

    Also die _INetSmtpMailcom hab ich in mail.au3

    Spoiler anzeigen
    [autoit]


    Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
    $objEmail.HTMLBody = $as_Body
    Else
    $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
    Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
    For $x = 1 To $S_Files2Attach[0]
    $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
    ;~ ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
    If FileExists($S_Files2Attach[$x]) Then
    ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
    $objEmail.AddAttachment($S_Files2Attach[$x])
    Else
    ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
    SetError(1)
    Return 0
    EndIf
    Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
    Case "High"
    $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"
    Case "Normal"
    $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"
    Case "Low"
    $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
    SetError(2)
    Return $oMyRet[1]
    EndIf
    $objEmail=""
    EndFunc ;==>_INetSmtpMailCom

    [/autoit]

    und die FileListToArrayRecursive hab ich in filelist.au3

    Spoiler anzeigen
    [autoit]


    ;~ #include-once
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _FileListToArrayRecursive
    ; Description ...: Lists files and/or folders in a specified path recursively
    ; Syntax.........: _FileListToArrayRecursive($sPath[, $sFilter = '*'[, $iFlag = 0[, $sCallback = ''[, $sCallbackUserParam = '' ] ] ] ] )
    ; Parameters ....: $sPath - Path to search
    ; $sFilter - Optional: the filter to use, default is *
    ; $iFlag - Optional: specifies options about return, add flags together
    ; |$iFlag = 0 (Default) Return both files and folders
    ; |$iFlag = 1 Return files only
    ; |$iFlag = 2 Return folders only
    ; |$iFlag = 4 Search subfolders (Enable recursion)
    ; |$iFlag = 8 Make array 0-based (Disable return count in first element)
    ; |$iFlag = 16 Return full paths (default only returns from the search folder down)
    ; $sCallback - Optional: function to call on each loop. See remarks for details (default: none)
    ; $sCallbackUserParam - Optional: a parameter to pass to the Callback function (default: none)
    ; Return values .: @Error - 1 = Path not found or invalid
    ; |2 = Invalid $sFilter
    ; |3 = Invalid $iFilter
    ; |4 = No files found or folder inaccessible
    ; |5 = No files found or folder inaccessible
    ; |-1 = Callback function returned -1
    ; Author ........: Rob Saunders (therks at therks dot com)
    ; Modified.......:
    ; Remarks .......: If $sCallback is defined the function will be called on each loop and it can alter what files are recorded
    ; in the return array. The Callback function runs on every file result because it is called *before* the flag
    ; filter for files/folders ($iFlag 1 or 2).
    ; Return 0 = Item is added (depending on $iFlag 1 or 2)
    ; Return 1 = Item is skipped (note: if you skip a folder it will not be searched either)
    ; Return -1 = Stop searching. Main func returns false, @error = -1, @extended = Callback's @extended value
    ; The function is passed one parameter, a 6 item array with values as follows:
    ; [0] root search folder
    ; [1] current sub folder
    ; [2] current filename match
    ; [3] 1 if file is a folder; 0 if not
    ; [4] current file count
    ; [5] $sCallbackUserParam
    ;
    ; Related .......: _FileListToArray
    ; Link ..........:
    ; Example .......:
    ; Note ..........: Some parts from original function (by SolidSnake) and _FileListToArrayEx (by DXRW4E)
    ; ===============================================================================================================================

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

    Func _FileListToArrayRecursive($sPath, $sFilter = '*', $iFlag = 0, $sCallback = '', $sCallbackUserParam = '')
    Local Const $FL_FILES = 1, $FL_FOLDERS = 2, $FL_RECURSE = 4, $FL_NOCOUNT = 8, $FL_FULLPATH = 16

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

    If Not StringInStr(FileGetAttrib($sPath), 'D') Then Return SetError(1, 1, '')
    If StringRegExp($sFilter, '[\\/:><\|]|(?s)\A\s*\z') Then Return SetError(2, 2, '')
    If $iFlag < 0 Or $iFlag > 1+2+4+8+16 Then Return SetError(3, 3, '')

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

    $sPath = StringRegExpReplace($sPath, '[\\/]+$', '') & '\'

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

    Local $sFileTrack, $iFileCount, $hParentSearch, $hSearch, $hSubCheck, $sSubDir, $sFile, $iIsFolder, $sRegExFilter, $sAddFullPath, _
    $iReturnFolders, $iReturnFiles, $iRecurse, $iReturnCount, $iSortOffset, _
    $aCallbackData[6], $vCallbackReturn, $iCallbackExt

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

    $aCallbackData[5] = $sCallbackUserParam

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

    If BitAND($iFlag, $FL_FULLPATH) Then $sAddFullPath = $sPath

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

    If BitAND($iFlag, $FL_RECURSE) Then
    $iRecurse = 1
    If StringReplace($sFilter, '*', '') Then ; If we ARE recursing, and the filter is something besides just * then initialize the regex filter
    $sRegExFilter = '(?i)^' & StringRegExpReplace(StringReplace(StringRegExpReplace($sFilter, '(\.|\||\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', "\\$1"), '?', '.'), '\*+', '.*') & '$'
    $sFilter = '*'
    EndIf
    EndIf

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

    If BitAND($iFlag, $FL_FILES) Then
    $iReturnFiles = 1
    ElseIf BitAND($iFlag, $FL_FOLDERS) Then
    $iReturnFolders = 1
    Else
    $iReturnFiles = 1
    $iReturnFolders = 1
    EndIf

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

    If BitAND($iFlag, $FL_NOCOUNT) Then
    $iReturnCount = 2 ; Param for StringSplit
    $iSortOffset = 0
    EndIf

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

    $hParentSearch = FileFindFirstFile($sPath & $sSubDir & $sFilter)
    If $hParentSearch = -1 Then Return SetError(4, 4, '')
    $hSearch = $hParentSearch
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    If $hParentSearch = $hSearch Then ExitLoop
    FileClose($hSearch)
    $hSearch -= 1
    $sSubDir = StringLeft($sSubDir, StringInStr(StringTrimRight($sSubDir, 1), '\', 0, -1))
    ContinueLoop
    EndIf
    $iIsFolder = @extended

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

    If $sCallback Then
    $aCallbackData[0] = $sPath
    $aCallbackData[1] = $sSubDir
    $aCallbackData[2] = $sFile
    $aCallbackData[3] = $iIsFolder
    $aCallbackData[4] = $iFileCount
    $vCallbackReturn = Call($sCallback, $aCallbackData)
    If @error = 0xDEAD And @extended = 0xBEEF Then
    FileClose($hSearch)
    FileClose($hParentSearch)
    Return SetError(5, 5, '')
    ElseIf $vCallbackReturn = -1 Then
    $iCallbackExt = @extended
    FileClose($hSearch)
    FileClose($hParentSearch)
    Return SetError(-1, $iCallbackExt, '')
    ElseIf $vCallbackReturn Then
    ContinueLoop
    EndIf
    EndIf

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

    If $iRecurse Then
    If ($iIsFolder And $iReturnFolders) Or (Not $iIsFolder And $iReturnFiles) Then
    If Not $sRegExFilter Or ($sRegExFilter And StringRegExp($sFile, $sRegExFilter)) Then
    $sFileTrack &= '|' & $sAddFullPath & $sSubDir & $sFile
    $iFileCount += 1
    EndIf
    EndIf

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

    If $iIsFolder Then
    $hSubCheck = FileFindFirstFile($sPath & $sSubDir & $sFile & '\' & $sFilter)
    If $hSubCheck = -1 Then ContinueLoop
    $sSubDir &= $sFile & '\'
    $hSearch = $hSubCheck
    EndIf
    Else
    If ($iIsFolder And $iReturnFolders) Or (Not $iIsFolder And $iReturnFiles) Then
    $sFileTrack &= '|' & $sAddFullPath & $sSubDir & $sFile
    $iFileCount += 1
    EndIf
    EndIf

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

    WEnd
    FileClose($hParentSearch)

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

    Local $aReturnList = StringSplit(StringTrimLeft($sFileTrack, 1), '|', $iReturnCount)
    If @error Then Return SetError(4, 4, '')
    Return $aReturnList
    EndFunc

    [/autoit]

    Habs nochmals laufen lassen und bekomme


    Code
    >"G:\****\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "G:\****\Sync.au3" /autoit3dir "C:\Program Files (x86)\AutoIt3" /UserParams	
    +>12:01:17 Starting AutoIt3Wrapper v.2.0.1.24	Environment(Language:0407  Keyboard:00000807  OS:WIN_7/Service Pack 1  CPU:X64 OS:X86)
    >Running AU3Check (1.54.19.0)  from:G:\****\AutoIt3
    +>12:01:19 AU3Check ended.rc:0
    >Running:(3.3.6.1):G:\****\autoit3.exe "G:\****\Sync.au3"	
    *****DOWNLOAD*****
    
    
    +>12:01:39 AutoIT3.exe ended.rc:0
    >Exit code: 0	Time: 24.524


    zurück. Nur das File is' immer noch nicht unten ?(

    Danke
    nico44

  • Wie du am ArrayDisplay erkennen kannst ist FileList ein 1D-Array:

    warum bei dir kein Fehler ausgegeben wird verstehe ich nicht. Ich habe dein Skript auf ein 1D_array angepasst und ConsoleWrite's eingefügt:

    Spoiler anzeigen
    [autoit]

    ;~ **** DOWNLOAD *****
    ElseIf $Direction = 'down' Then
    ConsoleWrite('*****DOWNLOAD*****' & @CRLF)
    $FileArray = _Ftp_ListToArray($Conn)
    ConsoleWrite(_FTP_DirGetCurrent($Conn) & @CRLF)
    _ArrayDisplay($FileArray)
    _FTP_FileGet($Conn, 'index.php', $LocalDir & 'test.txt');

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

    If IsArray($FileArray) Then
    ConsoleWrite($FileArray[0] & @TAB)
    For $i = 1 To $FileArray[0]
    ConsoleWrite($i & @TAB)
    If ($FileArray[$i] <> '.') And ($FileArray[$i] <> '..') Then
    If $SetPrefix == 'yes' Then
    $prefix = 't_' & @MDAY & @MON & @HOUR & @MIN
    Else
    $prefix = ''
    EndIf
    ConsoleWrite("Rename: " & $FileArray[$i] & " => " & $prefix & $FileArray[$i]&@CRLF)
    _FTP_FileRename($Conn, $FileArray[$i], $prefix & $FileArray[$i])
    ConsoleWrite("FileGet: " & $prefix & $FileArray[$i] & " => " & $prefix & $FileArray[$i]&@CRLF)
    $Ftpp = _FTP_FileGet($Conn, $prefix & $FileArray[$i], $LocalDir & $prefix & $FileArray[$i]);

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

    If $Ftpp == 1 Then
    FileWriteLine($file, ' - ' & $prefix & $FileArray[$i]);
    If $DeleteSrc == 'yes' Then
    ;_FTP_FileDelete($Conn, $prefix & $FileArray[$i][0])
    EndIf
    Else
    FileWriteLine($file, ' - ' & $prefix & $FileArray[$i] & ' <= hat nicht funktioniert!! ErrorCode: ' & @error);
    EndIf
    EndIf
    Next
    Else
    If $NotiIfNoFileDown == 'yes' Then
    #cs
    _INetSmtpMailcom('mail.*****.ch', _
    'autoJobs', _
    '*****@*****.ch', _
    $ErrMailAdr, _
    'Job Fehler 8' & $JobName, _
    'Der Job ' & $JobName & ' hat keine Files zum Herunterladen <br>' _
    & $LocalDir & _
    '<br>Datum: ' & @MDAY & '.' & @MON & '.' & @YEAR & '<br>Zeit: ' & @HOUR & ':' & @MIN & '<br><br>', _
    '', _
    '', _
    '', _
    '', _
    '**********', _
    '**********')
    #ce
    EndIf
    EndIf
    EndIf
    ;~ Verbindung wird geschlossen
    $Ftpc = _FTP_Close($Open)
    FileWriteLine($file, '------------------------------------[ENDE]-----------------------------');
    FileClose($file);

    [/autoit]

    die Ausgabe in der Console ist jetzt

    die Dateien (7-10) werden anstandslos heruntergeladen,

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (23. März 2012 um 15:44)

  • Hallo,

    Danke für die Hilfe. Ich wurde ein bisschen stutzig, als ich dein Skript laufen lies und es auch nicht funktionierte. X( ?(

    Anschliessend hab ich es auf unserem Server laufen lassen, und siehe da es geht. Unterschied ist meine Win7 Maschine. Ich habs jetzt zum laufen gebracht. Aber hat jemand eine Ahnung warum ich es auf der Win7 Maschine nicht zum laufen bringe. Ich bekomme nicht einmal das Arraydisplay :?:

    Danke auf jeden Fall und einen schönen Tag.

    Gruss
    nico44

  • Hast du Bit-Architektur Unterschiede, also 32 & 64 Bit? eventuell die falsche Option beim Kompilieren angegeben?
    ggf könntest du die Ausgaben in die Console in ein Textdokument umleiten damit du sie auch sehen kannst wen du nur die Exe aufrufst und die @error Meldungen mit in den Log schreiben eventuell sieht man das Problem dann schon.

    Gruß Marvin