_Multi_FileListToArray == _FileListToArray extended

    • Offizieller Beitrag

    Die Funktion _FileListToArray hat einige Nachteile:
    - bei gesetztem Dateifilter werden keine Ordner ausgegeben
    - es ist nur ein Dateifilter möglich
    - der Dateifilter arbeitet ungenau ("*.log" erkennt auch "*.log_1" etc.)

    Meine Funktion _Multi_FileListToArray ist von der Grundstruktur und den ersten Parametern, sowie den Fehlerausgaben der Funktion _FileListToArray angepasst.
    Die Unterschiede:
    - bei gesetztem Filter können wahlweise auch die Ordner mit ausgegeben werden
    - der Filter kann mit mehreren Suffixen bestückt werden (z.B. "jpg,jpeg,gif,png,bmp"), Syntax ohne "*."!
    - als Wildcard gilt "*"
    - die Dateiendung wird auf genaue Übereinstimmung geprüft (ausgenommen Groß- /Kleinschreibung)
    - wahlweise kann der gesamte Pfad zurückgegeben werden (nützlich, wenn man mit Dateioperationen weiterarbeiten möchte)
    - um bei gemeinsamer Ausgabe von Ordnern und Dateien diese deutlich unterscheiden zu können, kann wahlweise ein Präfix vor die Ausgabe der Ordner gesetzt werden (z.B. "[D] ")

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    $s = @ScriptDir
    $a = _Multi_FileListToArray($s, 'au3', 0, 0, '[D] ') ; == au3-Dateien und Ordner
    _ArrayDisplay($a, "au3-Dateien und Ordner")

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

    $a = _Multi_FileListToArray($s, 'au3', 1) ; == au3-Dateien ohne Ordner
    _ArrayDisplay($a, "au3-Dateien ohne Ordner")

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

    $a = _Multi_FileListToArray($s, 'au3', 0, 1, '[D] ') ; == au3-Dateien und Ordner, FullPath
    _ArrayDisplay($a, "au3-Dateien und Ordner, FullPath")

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

    $a = _Multi_FileListToArray($s, '*', 0, 0, '[D] ') ; == alle Dateien und Ordner
    _ArrayDisplay($a, "alle Dateien und Ordner")

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

    $a = _Multi_FileListToArray($s, 'jpg,jpeg,gif,png,bmp') ; == alle Bild-Dateien
    _ArrayDisplay($a, "alle Bild-Dateien ")

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

    ;===============================================================================
    ; Function Name....: _Multi_FileListToArray
    ; Description......: Dateien und/oder Ordner eines Pfades auflisten, mehrere Wildcards möglich
    ; Parameter(s).....: $_sPath Pfad für Auflistung
    ; .................: $_sFilter Filter für Dateityp(en), Wildcard ist "*" (Standard), mehrere Filter möglich, trennen mit "," z.B. "jpg,jpeg,gif,png,bmp"
    ; .................: $_iFlag 0 (Standard) = Dateien u. Ordner, 1 = nur Dateien, 2 = nur Ordner
    ; .................: $_fFullPath 0 (Standard) = nur Datei/Ordnername, 1 = kpl. Pfad
    ; .......optional..: $_sDirChar Standard "", Zeichen(folge), die einer Ordnerausgabe vorangestellt werden kann (z.B. "[D] ")
    ; Return Value(s)..: Erfolg Array mit den Dateien/Ordnern, Anzahl an $a[0]
    ; .................: Fehler 0 @error: 1-Pfad existiert nicht; 2-Filter fehlerhaft; 3-Flag fehlerhaft; 4-nichts gefunden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _Multi_FileListToArray($_sPath, $_sFilter='*', $_iFlag=0, $_fFullPath=0, $_sDirChar='')
    If Not FileExists($_sPath) Then Return SetError(1,0,0)
    If StringRegExp($_sFilter, '[.;\s]') Then Return SetError(2,0,0)
    If $_iFlag < 0 Or $_iFlag > 2 Then Return SetError(3,0,0)
    If StringRight($_sPath, 1) <> '\' Then $_sPath &= '\'
    Local $fAll = False, $sFiles = '', $aFilter[2] = [1,'*'], $hSearch, $sFound, $aRet, $sSuffix, $sPath = ''
    If $_fFullPath Then $sPath = $_sPath
    If $_sFilter = '*' Then $fAll = True
    If Not $fAll Then $aFilter = StringSplit($_sFilter, ',')
    $hSearch = FileFindFirstFile($_sPath & '*.*')
    While True
    $sFound = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    Switch $_iFlag
    Case 0
    If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ; == alle Ordner
    $sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
    Else ; == Dateien Filtern
    If $fAll Then
    $sFiles &= $sPath & $sFound & Chr(0) ; == alle Dateien
    Else
    For $i = 1 To $aFilter[0] ; == Dateien aus Filter
    $sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
    If $aFilter[$i] = $sSuffix Then
    $sFiles &= $sPath & $sFound & Chr(0)
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    Case 1 ; == Dateien
    If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
    If $fAll Then
    $sFiles &= $sPath & $sFound & Chr(0) ; == alle Dateien
    Else
    For $i = 1 To $aFilter[0] ; == Dateien aus Filter
    $sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
    If $aFilter[$i] = $sSuffix Then
    $sFiles &= $sPath & $sFound & Chr(0)
    ExitLoop
    EndIf
    Next
    EndIf
    Case 2 ; == Ordner
    If Not StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
    $sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
    EndSwitch
    WEnd
    $aRet = StringSplit(StringTrimRight($sFiles, 1), Chr(0))
    If @error Then Return SetError(4,0,0)
    Return $aRet
    EndFunc ;==> _Multi_FileListToArray

    [/autoit]