Rekursive Dateiauflistung

  • Hallo Leute

    Ich habe mal ein Script geschrieben um Datein rekursiv (inklusive Unterordner, UnterUnterordner... etc.) aufzulisten. Ich weis es gibt schon viele und jetzt halt noch eines mehr.
    Ich habe auch unteranderem eines von BugFix gefunden und gedacht da braucht es ja wirklich keines mehr von mir. Ich musste aber mit verwunderung feststellen, dass meines erheblich schnellen ist als seines.
    (Darauf geb ich keine Garantie. Vielleicht ists auch nur bei mir so) Deshalb poste ich es jetzt trozdem mal. Schaden kanns ja nicht.

    Zu sagen ist noch das man mit diesem Script (im Moment) noch nicht gezielt nach Dateinamen suchen, sonder nur die Endungen rausfiltern kann.

    Das Resultat wird Standardmässig in die Files.txt im Scriptverzeichniss geschrieben. Es kann aber auch als Array oder String mit @CRLF-Trennzeichen erhalten werden. (Siehe Beschreibung von $fFlag)

    Und natürlich noch das Script:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    #cs
    ===========================================================================================================================================

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

    _GetFiles
    ---------

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

    Version: 1.0

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

    Autor: Shadowigor

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

    Funktion: Gibt die Dateistruktur eines Pfades an (mit Filter)

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

    Parameter: $sPathFull Der zu durchsuchende Pfad (z.B C:\Users\Benutzer\*.* oder C:\Users\Benutzer\*.jpg)
    $fFlag 0 > Wird in Files.txt geschrieben
    1 > Gibt es als Array zurück
    2 > Gibt es als String zurück

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

    Bemerkung: Setzt @error und gibt "Nothing Found!" zurück (bzw. schreibt es in die Datei) wenn nichts gefunden wurde
    Gezielte Dateisuche wird noch nicht unterstützt.

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

    ===========================================================================================================================================
    #ce

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

    Func _GetFiles($sPathFull, $fFlag = 0)

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

    Local $aSubdirTmp[1], $aSubdir[1], $iLengh, $sPath, $sFile, $aFileList[1], $i, $sFileList, $sSubPath, $aFiles[1]

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

    $iLengh = StringInStr($sPathFull, "\", 0, -1)
    $sPath = StringLeft($sPathFull, $iLengh)
    $sFile = StringTrimLeft($sPathFull, $iLengh + 1)
    $iLengh = StringLen($sFile)

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

    If Not FileExists($sPath) Then
    If $fFlag = 0 Then
    $hFileWrite = FileOpen(@ScriptDir & "\Files.txt", 2)
    FileWrite($hFileWrite, "Nothing Found!")
    FileClose($hFileWrite)
    Return SetError(1)
    EndIf
    SetError(1)
    Return "Nothing Found!"
    EndIf

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

    $aFileList = _FileListToArray($sPath)

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

    For $i = 1 To $aFileList[0]
    If StringInStr(FileGetAttrib($sPath & $aFileList[$i]), "D") <> 0 Then
    _ArrayAdd($aSubdirTmp, $sPath & $aFileList[$i])
    _ArrayAdd($aFiles, $sPath & $aFileList[$i])
    ElseIf ($sFile = ".*") Or (StringRight($aFileList[$i], $iLengh) = $sFile) Then
    _ArrayAdd($aFiles, $sPath & $aFileList[$i])
    EndIf
    Next

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

    While UBound($aSubdirTmp) > 1
    $sSubPath = $aSubdirTmp[UBound($aSubdirTmp) - 1]
    $aFileList = _FileListToArray(_ArrayPop($aSubdirTmp))
    If IsArray($aFileList) Then
    For $i = 1 To $aFileList[0]
    If StringInStr(FileGetAttrib($sSubPath & "\" & $aFileList[$i]), "D") <> 0 Then
    _ArrayInsert($aSubdirTmp, 1, $sSubPath & "\" & $aFileList[$i])
    If $sFile = ".*" Then _ArrayInsert($aFiles, 1, $sSubPath & "\" & $aFileList[$i])
    ElseIf ($sFile = ".*") Or (StringRight($aFileList[$i], $iLengh) = $sFile) Then
    _ArrayInsert($aFiles, 1, $sSubPath & "\" & $aFileList[$i])
    EndIf
    Next
    EndIf
    WEnd

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

    If $fFlag = 1 Then Return $aFiles
    $sFileList = _ArrayToString($aFiles, @CRLF)
    If $fFlag = 2 Then Return $sFileList
    $hFileWrite = FileOpen(@ScriptDir & "\Files.txt", 2)
    FileWrite($hFileWrite, $sFileList)
    FileClose($hFileWrite)

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

    EndFunc ;==>_GetFiles

    [/autoit]


    Gruss Shadowigor