Fehler tritt in der 3.3.8.1 bei mir ebenfalls auf.
Es liegt aber nicht an isArray(). Beim Ausführen deines Beispiels zu _Ftp_ListToArray2D() reicht es schon, sich das _ArrayDisplay() anzuschauen. Man sieht ein 1dimensionales Array mit leeren Elementen. Da sagt isArray() natürlich OK aber der Zugriff auf $aArray[0][0] muss dennoch fehlschlagen.
Das Problem liegt irgendwo in der internen Funktion __FTP_ListToArray() in der FTPEx.au3.
Zum testen hab ich mal die Version aus einer 3.3.6.1 genommen und entsprechend in der 3.3.8.1 ersetzt.
Siehe da, es geht wieder.
Wenn man sich die beiden Versionen der Funktionen anschaut, hat sich da nicht allzu viel verändert aber wo da genau das Problem liegt vermag ich grad nicht zu erkennen. Ich wette Prog@ndy weiss es ![]()
__FTP_ListToArray() aus 3.3.6.1
; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __FTP_ListToArray
; Description ...:
; Syntax.........: __FTP_ListToArray($l_FTPSession, $Return_Type = 0, $l_Flags = 0, $bFmt = 1, $ArrayCount = 6)
; Parameters ....:
; Return values .: an 2D array with the requested info defined by $ArrayCount
; [0] Filename
; [1] Filesize
; [2] FileAttribute
; [3] File Modification time
; [4] File Creation time
; [5] File Access time
; Author ........: Beast, Prog@ndy
; Modified.......: jpm (to be use by external UDFs)
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func __FTP_ListToArray($l_FTPSession, $Return_Type = 0, $l_Flags = 0, $bFmt = 1, $ArrayCount = 6, $l_Context = 0)
Local $tWIN32_FIND_DATA, $tFileTime, $IsDir, $callFindNext
Local $DirectoryIndex = 0, $FileIndex = 0
If $ArrayCount = 1 Then
Local $FileArray[1], $DirectoryArray[1]
Else
Local $FileArray[1][$ArrayCount], $DirectoryArray[1][$ArrayCount]
EndIf
If $Return_Type < 0 Or $Return_Type > 2 Then Return SetError(1, 0, $FileArray)
[/autoit] [autoit][/autoit] [autoit];~ Global Const $tagWIN32_FIND_DATA = "DWORD dwFileAttributes; dword ftCreationTime[2]; dword ftLastAccessTime[2]; dword ftLastWriteTime[2]; DWORD nFileSizeHigh; DWORD nFileSizeLow; dword dwReserved0; dword dwReserved1; WCHAR cFileName[260]; WCHAR cAlternateFileName[14];"
$tWIN32_FIND_DATA = DllStructCreate($tagWIN32_FIND_DATA)
Local $callFindFirst = DllCall($__ghWinInet_FTP, 'handle', 'FtpFindFirstFileW', 'handle', $l_FTPSession, 'wstr', "", 'ptr', DllStructGetPtr($tWIN32_FIND_DATA), 'dword', $l_Flags, 'dword_ptr', $l_Context)
If @error Or Not $callFindFirst[0] Then Return SetError(1, _WinAPI_GetLastError(), 0)
Do
$IsDir = BitAND(DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) = $FILE_ATTRIBUTE_DIRECTORY
If $IsDir And ($Return_Type <> 2) Then
$DirectoryIndex += 1
If $ArrayCount = 1 Then
ReDim $DirectoryArray[$DirectoryIndex + 1]
$DirectoryArray[$DirectoryIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
Else
ReDim $DirectoryArray[$DirectoryIndex + 1][$ArrayCount]
$DirectoryArray[$DirectoryIndex][0] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
$DirectoryArray[$DirectoryIndex][1] = _WinAPI_MakeQWord(DllStructGetData($tWIN32_FIND_DATA, "nFileSizeLow"), DllStructGetData($tWIN32_FIND_DATA, "nFileSizeHigh"))
If $ArrayCount = 6 Then
$DirectoryArray[$DirectoryIndex][2] = DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes")
$tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastWriteTime"))
$DirectoryArray[$DirectoryIndex][3] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
$tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftCreationTime"))
$DirectoryArray[$DirectoryIndex][4] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
$tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastAccessTime"))
$DirectoryArray[$DirectoryIndex][5] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
EndIf
EndIf
ElseIf Not $IsDir And $Return_Type <> 1 Then
$FileIndex += 1
If $ArrayCount = 1 Then
ReDim $FileArray[$FileIndex + 1]
$FileArray[$FileIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
Else
ReDim $FileArray[$FileIndex + 1][$ArrayCount]
$FileArray[$FileIndex][0] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
$FileArray[$FileIndex][1] = _WinAPI_MakeQWord(DllStructGetData($tWIN32_FIND_DATA, "nFileSizeLow"), DllStructGetData($tWIN32_FIND_DATA, "nFileSizeHigh"))
If $ArrayCount = 6 Then
$FileArray[$FileIndex][2] = DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes")
$tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastWriteTime"))
$FileArray[$FileIndex][3] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
$tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftCreationTime"))
$FileArray[$FileIndex][4] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
$tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastAccessTime"))
$FileArray[$FileIndex][5] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
EndIf
EndIf
EndIf
$callFindNext = DllCall($__ghWinInet_FTP, 'bool', 'InternetFindNextFileW', 'handle', $callFindFirst[0], 'ptr', DllStructGetPtr($tWIN32_FIND_DATA))
If @error Then Return SetError(2, _WinAPI_GetLastError(), 0)
Until Not $callFindNext[0]
DllCall($__ghWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $callFindFirst[0])
; No need to test @error.
If $ArrayCount = 1 Then
$DirectoryArray[0] = $DirectoryIndex
$FileArray[0] = $FileIndex
Else
$DirectoryArray[0][0] = $DirectoryIndex
$FileArray[0][0] = $FileIndex
EndIf
Switch $Return_Type
Case 0
If $ArrayCount = 1 Then
ReDim $DirectoryArray[$DirectoryArray[0] + $FileArray[0] + 1]
For $i = 1 To $FileIndex
$DirectoryArray[$DirectoryArray[0] + $i] = $FileArray[$i]
Next
$DirectoryArray[0] += $FileArray[0]
Else
ReDim $DirectoryArray[$DirectoryArray[0][0] + $FileArray[0][0] + 1][$ArrayCount]
For $i = 1 To $FileIndex
For $j = 0 To $ArrayCount-1
$DirectoryArray[$DirectoryArray[0][0] + $i][$j] = $FileArray[$i][$j]
Next
Next
$DirectoryArray[0][0] += $FileArray[0][0]
EndIf
Return $DirectoryArray
Case 1
Return $DirectoryArray
Case 2
Return $FileArray
EndSwitch
EndFunc ;==>__FTP_ListToArray