_FileListToArray mit mehreren Filter

  • Ich möchte gerne in einem Listenfeld den Inhalt eines Ordners anzeigen der jedoch aus mehreren Dateifiltern bestehen soll.

    Da die Funktion _FileListToArray nur einen Filter erlaubt und _FileListToArrayEx bei der Sortierung ein Problem hat, wollte ich die Funktion _Array2DJoin nutzen um mehrere Arrays von Filtern zusammenfügen.

    Das hätte ich mir so vorgestellt:

    [autoit]


    Local $aFilelist1, $aFilelist2, $aFilelist3, $aFilelist, $ordnername = GUICtrlRead($input_ordnername)
    If $ordnername <> "" Then
    If StringRight($ordnername, 1) <> "\" Then GUICtrlSetData($input_ordnername, $ordnername & "\")
    If GUICtrlRead($combo_dateityp) = "IMAGE Dateien" Then
    $aFilelist1 = _FileListToArray($ordnername, "*.d" & StringLeft(GUICtrlRead($combo_dateityp), 3), 1)
    $aFilelist2 = _FileListToArray($ordnername, "*.g" & StringLeft(GUICtrlRead($combo_dateityp), 3), 1)
    $aFilelist3 = _FileListToArray($ordnername, "*.n" & StringLeft(GUICtrlRead($combo_dateityp), 3), 1)
    Local $aFilelist[3] = [$aFilelist1, $aFilelist2, $aFilelist3]
    For $i = 1 To UBound($aFilelist)-1
    _Array2DJoin($aFilelist[0], $aFilelist[$i])
    Next
    Else
    $aFilelist = _FileListToArray($ordnername, "*." & StringLeft(GUICtrlRead($combo_dateityp), 3), 1)
    EndIf
    If @error Then Return _GUICtrlListView_DeleteAllItems($listview_dateiliste)
    _GUICtrlListView_DeleteAllItems($listview_dateiliste)
    For $i = 1 To $aFilelist[0]
    GUICtrlCreateListViewItem(StringTrimRight($aFilelist[$i], 4) & "|" & StringLower(StringRight($aFilelist[$i], 3)), $listview_dateiliste)
    Next

    [/autoit]

    Leider kommt da nichts dabei heraus.
    Bekomme aber auch keine Fehlermeldung.

    Jemand eine Idee dazu?

  • Alternative: Bastel eine eigene FileReadToArray-Funktion bei welcher ein regulärer Ausdruck eingesetzt wird um den Dateinamen auf Muster hin zu überprüfen.
    Dann kannst du auch sehr viel komplexere Prüfungen durchführen bzw. dein Ziel der Suche mit mehreren Filtern erreichen.
    Mal ein Grundgerüst für eine solche Funktion:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $a_Files = myFileReadToArray(@SystemDir, "(.+\.dll|.+\.exe|.+\.txt)", 2)
    _ArrayDisplay($a_Files, "Ergebnis")

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

    Func myFileReadToArray(Const $s_Dir, Const $s_Pattern, Const $b_Flag = 3) ;$b_Flag 1=nur Ordner, 2=nur Dateien, 3=Dateien+Ordner
    Local $s_File, $s_Ret
    Local $h_FFFF = FileFindFirstFile($s_Dir & "\*")
    If $h_FFFF <> -1 Then
    Do
    $s_File = FileFindNextFile($h_FFFF)
    If @error Then ExitLoop

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

    If BitAND(2 - @extended, $b_Flag) Then
    If StringRegExp($s_File, $s_Pattern) Then $s_Ret &= $s_File & "|"
    EndIf
    Until 0
    EndIf
    Return StringSplit(StringTrimRight($s_Ret, 1), "|")
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (12. September 2011 um 00:55)

  • Meinst du sowas in etwa: ?

    Hat glaub ich Bugfix mal gepostet.
    Die Einteilung ist so ähnlich wie bei FileOpenDialog.
    Bsp:

    [autoit]

    _FileListToArrayMultiSelect(@ScriptDir,"*.jpg,*.jpeg,*.png,*.bmp",",",1)

    [/autoit][autoit]

    Func _FileListToArrayMultiSelect($dir,$searchlist,$Separator,$iFlag = 0)
    Local $FileList[1] = [0], $Filelist1, $iN, $Num, $search
    $search = StringSplit($searchlist, $Separator)
    If $search[0] > 0 Then
    For $iN = 1 To $search[0]
    $Filelist1 = _FileListToArray($dir, $search[$iN], $iFlag)
    If Not @error Then
    $Num = UBound($FileList)
    _ArrayConcatenate($FileList, $Filelist1)
    $FileList[0] = $FileList[0] + $FileList[$Num]
    _ArrayDelete($FileList, $Num)
    EndIf
    Next
    EndIf
    Return $FileList
    EndFunc

    [/autoit]