- 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
#include <Array.au3>
$s = @ScriptDir
$a = _Multi_FileListToArray($s, 'au3', 0, 0, '[D] ') ; == au3-Dateien und Ordner
_ArrayDisplay($a, "au3-Dateien und Ordner")
$a = _Multi_FileListToArray($s, 'au3', 1) ; == au3-Dateien ohne Ordner
_ArrayDisplay($a, "au3-Dateien ohne Ordner")
$a = _Multi_FileListToArray($s, 'au3', 0, 1, '[D] ') ; == au3-Dateien und Ordner, FullPath
_ArrayDisplay($a, "au3-Dateien und Ordner, FullPath")
$a = _Multi_FileListToArray($s, '*', 0, 0, '[D] ') ; == alle Dateien und Ordner
_ArrayDisplay($a, "alle Dateien und Ordner")
$a = _Multi_FileListToArray($s, 'jpg,jpeg,gif,png,bmp') ; == alle Bild-Dateien
_ArrayDisplay($a, "alle Bild-Dateien ")
;===============================================================================
; 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