- Offizieller Beitrag
Inspiration war diese Funktion von bernd670.
Ich dachte mir, dass es ganz nützlich wäre, wenn man das Suchpattern etwas variabler gestalten könnte, deshalb habe ich diese Funktion hier geschrieben, in der man ein RegExp-Pattern angeben kann.
Das funktioniert sowohl bei der Suche nach Dateien als auch bei Verzeichnissen. Schaut euch am besten mal die Beispiele an.
Spoiler anzeigen
#include <Array.au3> ; nur für die Beispiele erforderlich
If @AutoItVersion < '3.3.0.0' Then Exit MsgBox(16, 'Fehler', 'Funktioniert erst ab AutoIt-Version 3.3.0.0')
; Beispiele
$timer = TimerInit()
$aReturn = _RecursiveFileListToArray('C:', '', 2) ; Alle Verzeichnisse auf C:
ConsoleWrite(@error & @CRLF)
ConsoleWrite(Round(TimerDiff($timer)/1000, 3) & ' sek.' & @CRLF)
_ArrayDisplay($aReturn, 'Alle Verzeichnisse auf C:')
$timer = TimerInit()
$aReturn = _RecursiveFileListToArray('C:', '\.exe\z', 1) ; Alle Dateien mit der Erweiterung ".exe" (auf C:)
ConsoleWrite(@error & @CRLF)
ConsoleWrite(Round(TimerDiff($timer)/1000, 3) & ' sek.' & @CRLF)
_ArrayDisplay($aReturn, 'Alle Dateien mit der Erweiterung ".exe"')
$timer = TimerInit()
$aReturn = _RecursiveFileListToArray('C:', '\.au3\z', 1) ; Alle Dateien mit der Erweiterung ".au3" (auf C:)
ConsoleWrite(@error & @CRLF)
ConsoleWrite(Round(TimerDiff($timer)/1000, 3) & ' sek.' & @CRLF)
_ArrayDisplay($aReturn, 'Alle Dateien mit der Erweiterung ".au3"')
$timer = TimerInit()
$aReturn = _RecursiveFileListToArray('C:', 'autoit.*\..+\z', 1) ; Alle Dateien in denen "autoit" im Dateinamen vorkommt (auf C:)
ConsoleWrite(@error & @CRLF)
ConsoleWrite(Round(TimerDiff($timer)/1000, 3) & ' sek.' & @CRLF)
_ArrayDisplay($aReturn, 'Alle Dateien in denen "autoit" im Dateinamen vorkommt')
;===============================================================================
; Function Name: _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
; Description:: gibt Verzeichnisse und/oder Dateien (rekursiv) zurück, die
; einem RegExp-Pattern entsprechen
; Parameter(s): $sPath = Startverzeichnis
; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
; $iFlag = Auswahl
; 0 = Dateien & Verzeichnisse
; 1 = nur Dateien
; 2 = nur Verzeichnisse
; $iFormat = Rückgabeformat
; 0 = String
; 1 = Array mit [0] = Anzahl
; 2 = Nullbasiertes Array
; $sDelim = Trennzeichen für die String-Rückgabe
; Requirement(s): AutoIt 3.3.0.0
; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
; Author(s): Oscar (http://www.autoit.de)
; Anregungen von: bernd670 (http://www.autoit.de)
;===============================================================================
Func _RecursiveFileListToArray($sPath, $sPattern, $iFlag = 0, $iFormat = 1, $sDelim = @CRLF)
Local $hSearch, $sFile, $sReturn = ''
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*.*')
If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
While True
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
$sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
ContinueLoop
EndIf
If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
WEnd
FileClose($hSearch)
If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
Return $sReturn
EndFunc
Edit: Es gab noch einen kleinen Fehler beim einlesen von allen Dateien und Verzeichnissen. Dabei wurden die Verzeichnisse nochmal als Datei eingelesen. Behoben! (1 Zeile eingefügt: ContinueLoop)