_RecursiveFileListToArray (mit StringRegExp)

    • 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
    [autoit]


    #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')

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

    ; 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:')

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

    $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"')

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

    $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"')

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

    $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')

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

    ;===============================================================================
    ; 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

    [/autoit]

    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)

  • Hmm ob die Idee neu ist bezweifel ich ein wenig.. siehe hier -> RecursiveFileSearch(letzte Variante von den 7)
    Beide Scripts ähneln sich sehr stark.. hab aber beide für alle Files auf meinem C-Laufwerk getestet! Meine Ergebnisse:

    Oscar - 240 secs
    weaponx - 62 secs

    Hmm merkwürdig.. hatte beim ersten Durchlauf bei Oscars Script auf nur Verzeichnisse gemacht! Beim zweiten Durchlauf kam diesmal das raus:

    Oscar - 64 secs
    weaponx - 62 secs

    Oscars script holt auf!

    Dritter:

    Oscar - 52,2
    weaponx - 52,9

    Der allererste Versuch war anscheinend doch nur ein Fehlzünder.. die Scripts sind relativ gleich!

    3 Mal editiert, zuletzt von ChaosKeks (31. Mai 2009 um 23:56)

  • Achso.. und wo liegt der Unterschied zwischen deinem RegEx und dem von weaponX? ^^