FTP - Verbindung als Laufwerk mappen

  • Hallo zusammen,

    ich möchte über eine FTP-Verbindung eine komplette Datensicherung von einer WEB-Seite machen. Dabei möchte ich einige Verzeichnisse (Cache) ausschließen. Da ich zur Auflistung der rund 10.000 Dateien "_FileListRekursiv" nutzen möchte ist es notwendig die FTP-Verbindung als Laufwerk zu Mappen. Der Aufbau der Verbindung ist kein Problem. Aber am Mappen häng ich nun schon zwei Tage. Hab hier im Forum gesucht aber nix zum Thema gefunden. Kann mir jemand von Euch helfen ??? Bin für jeden Gedankenanstoß dankbar...

    Gruß De Rand Ere

    Wenn Du's eilig hast - geh langsam...

  • Da ich zur Auflistung der rund 10.000 Dateien "_FileListRekursiv" nutzen möchte ist es notwendig die FTP-Verbindung als Laufwerk zu Mappen.

    Warum willst du dir die Dateiliste nicht direkt über die FTP-Funktionen holen?
    Mal als Beispiel:

    Ordnerauflistung auf FTP-Server
    [autoit]

    #include <ftpEx.au3>
    #include <array.au3>

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

    $server = 'ftp.csx.cam.ac.uk'
    $username = ''
    $pass = ''

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

    $hFTP = _FTP_Open('FTP_open')
    $hFTPCon = _FTP_Connect($hFTP, $server, $username, $pass)

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

    $aFileList = _FTP_FileList($hFTPCon, "pub/software/")
    _ArrayDisplay($aFileList)

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: FLwStr()
    ; Description ...: Listet die Ordnerstruktur einer FTP-Verbindung
    ; Syntax ........: _FTP_FileList($hConn, Const[ $sPath = '', Const[ $iF = 3]])
    ; Parameters ....: $hConn - Eine FTP-Connection wie von _FTP_Connect zurückgegeben
    ; Const $sPath - [optional] Ordner welche durchsucht werden sollen (mehrere gleichzeitig mit "|" trennen)
    ; Const $iF - [optional] 1=nur Dateien, 2=nur Ordner, 3=Dateien+Ordner (default:3)
    ; Const $iSSFlag - [optional] 0=Rückgabearray mit Anzahl Elemente in $Array0, 2=Rückgabearray ohne Anzahl Elemente
    ; Return values .: Ein Array mit den Datei/Ordner-Pfaden
    ; Author ........: AspirinJunkie
    ; =================================================================================================
    Func _FTP_FileList(Const $hConn, Const $sPath = "", Const $iF = 3, Const $iSSFlag = 2)
    ;by AspirinJunkie
    Local $hFFFF, $aNext, $sRet = "", $sSubD = "", $sDir, $iC

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

    For $i In StringSplit($sPath, '|', 2)
    If StringRight($i, 1) = '/' Then $i = StringTrimRight($i, 1)
    $sSubD &= '|' & $i
    Next

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

    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)

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

    $aNext = _FTP_FindFileFirst($hConn, $sDir, $hFFFF)
    If @error Then ContinueLoop

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

    If BitAND($aNext[1], 16) Then
    $sSubD &= '|' & $sDir & '/' & $aNext[10]
    If BitAND(2, $iF) Then $sRet &= $sDir & '/' & $aNext[10] & '/|'
    ElseIf BitAND(1, $iF) Then
    $sRet &= $sDir & '/' & $aNext[10] & '|'
    EndIf

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

    Do
    $aNext = _FTP_FindFileNext($hFFFF)
    If @error Then ExitLoop
    If BitAND($aNext[1], 16) Then
    $sSubD &= '|' & $sDir & '/' & $aNext[10]
    If BitAND(2, $iF) Then $sRet &= $sDir & '/' & $aNext[10] & '/|'
    ElseIf BitAND(1, $iF) Then
    $sRet &= $sDir & '/' & $aNext[10] & '|'
    EndIf
    Until 0
    _FTP_FindFileClose($hFFFF)
    Until 0

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

    Return StringSplit(StringTrimRight($sRet, 1), '|', $iSSFlag)
    EndFunc ;==>_FTP_FileList

    [/autoit]
  • Hallo AspirinJunkie,
    vielen Dank für Deine Antwort. Die Funktion kannte ich nicht. Habs auch gleich mal getestet. Komm aber mit der Pfadangabe nicht klar. Entweder gibt es Null Einträge im Array oder das Script verschwindet im Nirvana und wird nie fertig.

    Mein TestScript:

    Spoiler anzeigen


    #include <ftpEx.au3>
    #include <array.au3>

    $server = 'ftp.website.de'
    $username = 'U12345678'
    $pass = 'P123456789'

    ;~ $hFTP = _FTP_Open('FTP_open')
    ;~ $hFTPCon = _FTP_Connect($hFTP, $server, $username, $pass)

    $hFTP = _FTP_Open("BackUp")

    $hFTP_Sitzung = _FTP_Connect($hFTP,$server,$username,$pass)

    $vDir = _FTP_DirGetCurrent($hFTP_Sitzung) ; nur zum Test, ob FTP-Verbindung läuft
    MsgBox(1,"Test FTP", "Test Dir: "&$vDir)

    $aFileList = _FTP_FileList($hFTP_Sitzung, '/logs/')
    _ArrayDisplay($aFileList)

    _FTP_Close($hFTP_Sitzung)
    _FTP_Close($hFTP)

    Exit

    ;Deine Funktion folgt.....

    Wenn Du's eilig hast - geh langsam...

  • oder das Script verschwindet im Nirvana und wird nie fertig.

    Die Dateiauflistung ist ziemlich langatmig.
    Um zu schauen ob etwas gemacht wird, kannst du dir während des Iterierens mal die Ergebnisse ausgeben lassen:

    Spoiler anzeigen
    [autoit]

    #include <ftpEx.au3>
    #include <array.au3>

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

    $server = 'ftp.csx.cam.ac.uk'
    $username = ''
    $pass = ''

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

    $hFTP = _FTP_Open('FTP_open')
    $hFTPCon = _FTP_Connect($hFTP, $server, $username, $pass)

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

    $aFileList = _FTP_FileList($hFTPCon, "/pub/software/")
    _ArrayDisplay($aFileList)

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: FLwStr()
    ; Description ...: Listet die Ordnerstruktur einer FTP-Verbindung
    ; Syntax ........: _FTP_FileList($hConn, Const[ $sPath = '', Const[ $iF = 3]])
    ; Parameters ....: $hConn - Eine FTP-Connection wie von _FTP_Connect zurückgegeben
    ; Const $sPath - [optional] Ordner welche durchsucht werden sollen (mehrere gleichzeitig mit "|" trennen)
    ; Const $iF - [optional] 1=nur Dateien, 2=nur Ordner, 3=Dateien+Ordner (default:3)
    ; Const $iSSFlag - [optional] 0=Rückgabearray mit Anzahl Elemente in $Array0, 2=Rückgabearray ohne Anzahl Elemente
    ; Return values .: Ein Array mit den Datei/Ordner-Pfaden
    ; Author ........: AspirinJunkie
    ; =================================================================================================
    Func _FTP_FileList(Const $hConn, Const $sPath = "", Const $iF = 3, Const $iSSFlag = 2)
    ;by AspirinJunkie
    Local $hFFFF, $sRet = "", $sSubD = "", $sDir, $iC, $a_Ret, $s_File
    Local $t_FTPFileData = DllStructCreate($tagWIN32_FIND_DATA)

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

    For $i In StringSplit($sPath, '|', 2)
    If StringRight($i, 1) = '/' Then $i = StringTrimRight($i, 1)
    $sSubD &= '|' & $i
    Next

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

    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)

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

    $a_Ret = DllCall($__g_hWinInet_FTP, 'handle', 'FtpFindFirstFileW', 'handle', $hConn, 'wstr', $sDir, 'struct*', $t_FTPFileData, 'dword', $INTERNET_FLAG_NO_CACHE_WRITE, 'dword*', 0)
    If @error Or Not $a_Ret[0] Then ContinueLoop
    $hFFFF = $a_Ret[0]
    $s_File = DllStructGetData($t_FTPFileData, "cFileName")
    If BitAND(DllStructGetData($t_FTPFileData, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) Then ; Directory
    $sSubD &= '|' & $sDir & '/' & $s_File
    If BitAND(2, $iF) Then $sRet &= $sDir & '/' & $s_File & '/|'
    ConsoleWrite($sDir & '/' & $s_File & '/' & @CRLF)
    ElseIf BitAND(1, $iF) Then ; a File
    $sRet &= $sDir & '/' & $s_File & '|'
    ConsoleWrite($sDir & '/' & $s_File & @CRLF)
    EndIf

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

    Do
    $a_Ret = DllCall($__g_hWinInet_FTP, 'bool', 'InternetFindNextFileW', 'handle', $hFFFF, 'struct*', $t_FTPFileData)
    If Not $a_Ret[0] Or @error Then ExitLoop
    $s_File = DllStructGetData($t_FTPFileData, "cFileName")

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

    If @error Then ExitLoop
    If BitAND(DllStructGetData($t_FTPFileData, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) Then ; Directory
    $sSubD &= '|' & $sDir & '/' & $s_File
    If BitAND(2, $iF) Then $sRet &= $sDir & '/' & $s_File & '/|'
    ConsoleWrite($sDir & '/' & $s_File & '/' & @CRLF)
    ElseIf BitAND(1, $iF) Then ; a File
    $sRet &= $sDir & '/' & $s_File & '|'
    ConsoleWrite($sDir & '/' & $s_File & @CRLF)
    EndIf
    Until 0
    DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $hFFFF)
    Until 0

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

    Return StringSplit(StringTrimRight($sRet, 1), '|', $iSSFlag)
    EndFunc ;==>_FTP_FileList

    [/autoit]


    Dann siehst du, ob das Skript noch läuft oder hängt.
    Alternativ kannst du statt der Consolewrites auch direkt mit den Dateien weiterarbeiten während du iterierst.

  • Ja, hab ich gestestet und folgende "Erscheinung" registriert...

    Console zu Beginn:

    Spoiler anzeigen


    WebSeite.de/logs/./
    WebSeite.de/logs/../
    WebSeite.de/logs/access_log_2014-09-19.gz
    WebSeite.de/logs/access_log_2014-09-23.gz
    WebSeite.de/logs/access_log_2014-09-24.gz
    WebSeite.de/logs/access_log_2014-09-25.gz
    WebSeite.de/logs/access_log_2014-09-29.gz
    WebSeite.de/logs/access_log_2014-09-30.gz
    WebSeite.de/logs/access_log_2014-10-02.gz
    WebSeite.de/logs/access_log_2014-10-06.gz
    WebSeite.de/logs/access_log_2014-10-07.gz
    WebSeite.de/logs/access_log_2014-10-08.gz
    WebSeite.de/logs/access_log_2014-10-09.gz
    WebSeite.de/logs/access_log_2014-10-11.gz
    WebSeite.de/logs/access_log_2014-10-13.gz
    WebSeite.de/logs/access_log_2014-10-14.gz
    WebSeite.de/logs/access_log_2014-10-15.gz
    WebSeite.de/logs/access_log_2014-10-27.gz
    WebSeite.de/logs/access_log_2014-10-28.gz
    WebSeite.de/logs/access_log_2014-10-30.gz
    WebSeite.de/logs/access_log_2014-11-04.gz
    WebSeite.de/logs/access_log_2014-11-05.gz
    WebSeite.de/logs/access_log_2014-11-06.gz
    WebSeite.de/logs/access_log_2014-11-07.gz
    WebSeite.de/logs/access_log_2014-11-10.gz
    WebSeite.de/logs/access_log_2014-11-11.gz
    WebSeite.de/logs/access_log_2014-11-13.gz
    WebSeite.de/logs/access_log_2014-11-17.gz
    WebSeite.de/logs/access_log_2014-11-18.gz
    WebSeite.de/logs/access_log_2014-11-20.gz
    WebSeite.de/logs/access_log_2014-11-24.gz
    WebSeite.de/logs/access_log_2014-11-26.gz
    WebSeite.de/logs/access_log_2014-12-01.gz
    WebSeite.de/logs/access_log_2014-12-03.gz
    WebSeite.de/logs/access_log_2014-12-08.gz
    WebSeite.de/logs/access_log_2014-12-11.gz
    WebSeite.de/logs/access_log_2014-12-13.gz
    WebSeite.de/logs/access_log_2014-12-16.gz
    WebSeite.de/logs/access_log_2014-12-18.gz
    WebSeite.de/logs/access_log_2014-12-19.gz
    WebSeite.de/logs/access_log_2014-12-21.gz
    WebSeite.de/logs/access_log_2014-12-22.gz
    WebSeite.de/logs/access_log_2014-12-25.gz
    WebSeite.de/logs/access_log_2014-12-29.gz
    WebSeite.de/logs/access_log_2015-01-06.gz
    WebSeite.de/logs/access_log_2015-01-12.gz
    WebSeite.de/logs/access_log_2015-01-13.gz
    WebSeite.de/logs/access_log_2015-01-14.gz
    WebSeite.de/logs/access_log_2015-01-19.gz
    WebSeite.de/logs/access_log_2015-01-20.gz

    Das sieht ganz normal aus.
    Aber dann verlässt das Script den Ordner /logs/...

    Spoiler anzeigen


    WebSeite.de/logs/.././
    WebSeite.de/logs/../../
    WebSeite.de/logs/../.htaccess
    WebSeite.de/logs/../GPL-LICENSE.txt
    WebSeite.de/logs/../GPL-LIZENZUEBERSETZUNG.txt
    WebSeite.de/logs/../GProtector/
    WebSeite.de/logs/../cache/
    WebSeite.de/logs/../callback/
    WebSeite.de/logs/../checkout_billsafe.php
    WebSeite.de/logs/../checkout_confirmation.php
    WebSeite.de/logs/../checkout_ipayment.php
    WebSeite.de/logs/../checkout_masterpayment.php
    WebSeite.de/logs/../checkout_payment.php

    Und etwas später kommt dann scheinbar der Punkt, an dem sich das Script totläuft...

    Spoiler anzeigen


    WebSeite.de/logs/../version_info/../cache/
    WebSeite.de/logs/../version_info/../callback/
    WebSeite.de/logs/../version_info/../checkout_billsafe.php
    WebSeite.de/logs/../version_info/../checkout_confirmation.php
    WebSeite.de/logs/../version_info/../checkout_ipayment.php
    WebSeite.de/logs/../version_info/../checkout_masterpayment.php
    WebSeite.de/logs/../version_info/../checkout_payment.php

    WebSeite.de/logs/../version_info/../version_info/../cache/
    WebSeite.de/logs/../version_info/../version_info/../callback/
    WebSeite.de/logs/../version_info/../version_info/../checkout_billsafe.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_confirmation.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_ipayment.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_masterpayment.php
    WebSeite.de/logs/../version_info/../version_info/../checkout_payment.php

    Das ist natürlich nur ein Auszug aus der Auflistung. Aber der Teilname "/version_info/.." wird immer wieder neu dazu eingetragen somit, daß der Dateiname "unendlich" wird.

    Leider kann ich Dein Script nicht ganz nachvollziehen. Mit den "BitAnd" komm ich nicht klar.

    Wenn ich z.B. über den Totalcommander eine FTP-Verbindung aufbaue und mir die Datenstruktur ansehe, dann gibt es kein "version_info"-Verzeichnis.
    Eigenartig ist auch, daß mir der Totalcommander im Verzeichnis "/logs/" 14 Datein anzeigt. Mit _FTP_FindFirst und _FTP_FindNext finde ich aber ca. 110 Dateien. Kann ich nicht nachvollziehen.

    Wenn Du's eilig hast - geh langsam...

  • PS:
    Nach ca. einer Stunde sieht das dann so aus...

    Spoiler anzeigen


    WebSeite.de/logs/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../version_info/../pub/.././ext/../../usage/

    Wenn Du's eilig hast - geh langsam...

  • Interessanter Effekt.
    Ist natürlich etwas schwierig auf Ursachensuche zu gehen wenn ich das Verhalten bei mir nicht reproduzieren kann aber ich vermute mal ganz spontan, dass da sowas wie Reparse-Points mit drin stecken.
    Hab das Skript mal so erweitert, dass er sich meldet sobald ein Ordner mehr Dateiattribute gesetzt bekommen hat als nur ein einfaches Ordner-Flag.
    Falls es daran liegt können wir so vielleicht erfahren, was dies verursacht:

    Spoiler anzeigen
    [autoit]

    #include <ftpEx.au3>
    #include <array.au3>

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

    $server = 'ftp.csx.cam.ac.uk'
    $username = ''
    $pass = ''

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

    $hFTP = _FTP_Open('FTP_open')
    $hFTPCon = _FTP_Connect($hFTP, $server, $username, $pass)

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

    $aFileList = _FTP_FileList($hFTPCon, "/pub/software/")
    _ArrayDisplay($aFileList)

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _FTP_FileList()
    ; Description ...: Listet die Ordnerstruktur einer FTP-Verbindung
    ; Syntax ........: _FTP_FileList($hConn, Const[ $sPath = '', Const[ $iF = 3]])
    ; Parameters ....: $hConn - Eine FTP-Connection wie von _FTP_Connect zurückgegeben
    ; Const $sPath - [optional] Ordner welche durchsucht werden sollen (mehrere gleichzeitig mit "|" trennen)
    ; Const $iF - [optional] 1=nur Dateien, 2=nur Ordner, 3=Dateien+Ordner (default:3)
    ; Const $iSSFlag - [optional] 0=Rückgabearray mit Anzahl Elemente in $Array0, 2=Rückgabearray ohne Anzahl Elemente
    ; Return values .: Ein Array mit den Datei/Ordner-Pfaden
    ; Author ........: AspirinJunkie
    ; =================================================================================================
    Func _FTP_FileList(Const $hConn, Const $sPath = "", Const $iF = 3, Const $iSSFlag = 2)
    ;by AspirinJunkie
    Local $hFFFF, $sRet = "", $sSubD = "", $sDir, $iC, $a_Ret, $s_File
    Local $t_FTPFileData = DllStructCreate($tagWIN32_FIND_DATA)

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

    For $i In StringSplit($sPath, '|', 2)
    If StringRight($i, 1) = '/' Then $i = StringTrimRight($i, 1)
    $sSubD &= '|' & $i
    Next

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

    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)

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

    $a_Ret = DllCall($__g_hWinInet_FTP, 'handle', 'FtpFindFirstFileW', 'handle', $hConn, 'wstr', $sDir, 'struct*', $t_FTPFileData, 'dword', 0, 'dword*', 0)
    If @error Or Not $a_Ret[0] Then ContinueLoop
    $hFFFF = $a_Ret[0]
    $s_File = DllStructGetData($t_FTPFileData, "cFileName")
    If BitAND(DllStructGetData($t_FTPFileData, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) Then ; Directory
    If BitXOR(DllStructGetData($t_FTPFileData, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) Then MsgBox(0, "Ordnereigenschaften", $sDir & '/' & $s_File & '/: ' & DllStructGetData($t_FTPFileData, "dwFileAttributes"))
    $sSubD &= '|' & $sDir & '/' & $s_File
    If BitAND(2, $iF) Then $sRet &= $sDir & '/' & $s_File & '/|'
    ElseIf BitAND(1, $iF) Then ; a File
    $sRet &= $sDir & '/' & $s_File & '|'
    EndIf

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

    Do
    $a_Ret = DllCall($__g_hWinInet_FTP, 'bool', 'InternetFindNextFileW', 'handle', $hFFFF, 'struct*', $t_FTPFileData)
    If Not $a_Ret[0] Or @error Then ExitLoop
    $s_File = DllStructGetData($t_FTPFileData, "cFileName")

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

    If @error Then ExitLoop
    If BitAND(DllStructGetData($t_FTPFileData, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) Then ; Directory
    If BitXOR(DllStructGetData($t_FTPFileData, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) Then MsgBox(0, "Ordnereigenschaften", $sDir & '/' & $s_File & '/: ' & DllStructGetData($t_FTPFileData, "dwFileAttributes"))
    $sSubD &= '|' & $sDir & '/' & $s_File
    If BitAND(2, $iF) Then $sRet &= $sDir & '/' & $s_File & '/|'
    ElseIf BitAND(1, $iF) Then ; a File
    $sRet &= $sDir & '/' & $s_File & '|'
    EndIf
    Until 0
    DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $hFFFF)
    Until 0

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

    Return StringSplit(StringTrimRight($sRet, 1), '|', $iSSFlag)
    EndFunc ;==>_FTP_FileList

    [/autoit]