Dateien und/oder Ordner rekursiv auflisten

    • Offizieller Beitrag

    Auf besonderen Wunsch von Oscar poste ich hier mal meine Funktion zum rekursiven Suchen von Datein und/oder Odnern.

    Spoiler anzeigen
    [autoit]


    ;===============================================================================
    ; Name: FileListRecursive
    ; Description: Sucht rekursiv nach Dateien und Ordnern
    ; Parameter(s): $szStartPath = Path ab dem gesucht werden soll
    ; $szFileName = Datei nach der gesucht werden soll
    ; $iFlag (optional) = Gibt an was zurückgegeben werden soll
    ; 0 = Dateien und Ordner (default)
    ; 1 = nur Dateien
    ; 2 = nur Ordner (ignoriert $szFileName)
    ; $iRetFormat (optional) = Rückgabeformat
    ; 0 = als String (default)
    ; 1 = als Array
    ; $szDelim (optional) = Trennzeichen wenn $iRetFormat = 0 (@CRLF ist default)
    ; Requirement(s): keine
    ; Return Value(s): bei Erfolg: Ergebnis als String oder Array
    ; bei Fehler:
    ; Author(s): bernd670
    ;
    ;===============================================================================
    Func FileListRecursive($szStartPath, $szFileName, $iFlag = 0, $iRetFormat = 0, $szDelim = @CRLF)
    Local $hFF, $szFindName, $szRetValue = ""

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

    If $iFlag = Default Then $iFlag = 0
    If $iRetFormat = Default Then $iRetFormat = 0
    If $szDelim = Default Then $szDelim = @CRLF

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

    If StringRight($szStartPath, 1) <> "\" Then $szStartPath &= "\"

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

    If $iFlag < 2 Then
    $hFF = FileFindFirstFile($szStartPath & $szFileName)

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

    If $hFF <> -1 Then
    While True
    $szFindName = FileFindNextFile($hFF)
    If @error Then
    FileClose($hFF)
    ExitLoop
    EndIf
    If ($szRetValue <> "") And (StringRight($szRetValue, StringLen($szDelim)) <> $szDelim) Then $szRetValue &= $szDelim
    $szRetValue &= $szStartPath & $szFindName
    WEnd
    EndIf
    EndIf
    $hFF = FileFindFirstFile($szStartPath & "*.*")

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

    If $hFF = -1 Then Return $szRetValue

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

    While True
    $szFindName = FileFindNextFile($hFF)
    If @error Then
    FileClose($hFF)
    ExitLoop
    EndIf

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

    If StringInStr(FileGetAttrib($szStartPath & $szFindName), "d") Then
    If ($szRetValue <> "") And (StringRight($szRetValue, StringLen($szDelim)) <> $szDelim) Then $szRetValue &= $szDelim
    If ($iFlag = 0) Or ($iFlag = 2) Then $szRetValue &= $szStartPath & $szFindName & "\" & $szDelim
    $szRetValue &= FileListRecursive($szStartPath & $szFindName & "\", $szFileName, $iFlag, 0, $szDelim)
    EndIf
    WEnd

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

    If StringRight($szRetValue, StringLen($szDelim)) = $szDelim Then $szRetValue = StringTrimRight($szRetValue, StringLen($szDelim))
    If $iRetFormat = 0 Then
    Return $szRetValue
    Else
    Return StringSplit($szRetValue, $szDelim, 1)
    EndIf
    EndFunc ;==>FileListRecursive

    [/autoit]
  • Vielen Dank, bernd. :)

    Kann ich gut gebrauchen.
    Die von BugFix per Objekt ist auch sehr gut.

    EDIT:
    Deine Funktion listet aber nur auf und gibt nicht die gesuchte Datei zurück !?!
    Habe sie etwas umgeschieben, funktioniert mit Verzeichnissen und Dateien.

    Spoiler anzeigen
    [autoit]

    ;
    $sDir = "C:\"
    $sFile = FileFindRecursive ($sDir, "autoit3.exe")

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

    ConsoleWrite ("----------------------------------------------" & @crlf)

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

    If $sFile Then
    ConsoleWrite (StringFormat ("+> Datei gefunden in %s\n", $sFile))
    Else
    ConsoleWrite (StringFormat ("!> Datei wurde nicht gefunden in %s\n", $sFile))
    EndIf

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

    ConsoleWrite ("----------------------------------------------" & @crlf)

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

    ;===============================================================================
    ; Name: FileFindRecursive
    ; Description: Sucht rekursiv nach Dateien und Ordnern
    ; Parameter(s): $szStartPath = Pfad ab dem gesucht werden soll
    ; $szFileName = Datei nach der gesucht werden soll
    ; Requirement(s): keine
    ; Return Value(s): bei Erfolg: Ergebnis als String
    ; bei Fehler: Null
    ; Author(s):
    ;
    ;===============================================================================
    Func FileFindRecursive ($szStartPath, $szFileName)

    Local $hFF, $szFindName, $szRetValue = ""

    If StringRight ($szStartPath,1) <> "\" Then $szStartPath &= "\"

    $hFF = FileFindFirstFile ($szStartPath & $szFileName)

    If $hFF <> -1 Then
    While True
    $szFindName = FileFindNextFile ($hFF)
    If @error Then
    FileClose ($hFF)
    ExitLoop
    EndIf

    $szRetValue &= $szStartPath & $szFindName

    If $szFindName == $szFileName Then _
    Return $szRetValue ; Datei gefunden !

    WEnd
    EndIf

    $hFF = FileFindFirstFile ($szStartPath & "*.*")

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

    If $hFF = -1 Then Return 0 ; Datei NICHT gefunden !

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

    While True
    $szFindName = FileFindNextFile ($hFF)
    If @error Then
    FileClose ($hFF)
    ExitLoop
    EndIf

    If $szFindName == $szFileName Then _
    Return $szRetValue ; Datei gefunden !

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

    If StringInStr (FileGetAttrib ($szStartPath & $szFindName), "d") Then
    $szRetValue = FileFindRecursive ($szStartPath & $szFindName & "\", $szFileName)

    If $szRetValue Then _
    Return $szRetValue ; Datei gefunden !

    EndIf
    WEnd

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

    Return 0 ; Datei NICHT gefunden !

    EndFunc ;==>FileFindRecursive
    ;

    [/autoit]


    edit bernd670: Author entfernt - die Funktion ist so nicht von mir

    Gruß
    Greenhorn


    3 Mal editiert, zuletzt von bernd670 (19. Mai 2009 um 06:27)

    • Offizieller Beitrag

    Bernd, mir ist gerade noch ein Fehler aufgefallen. Und zwar: Es wird bei der Array-Rückgabe ein Element (das letzte ist immer ein Leerstring) zuviel zurückgegeben. Das liegt am StringSplit, weil am Ende des Strings "$szRetValue" ja immer auch das Delimeterzeichen sitzt.
    Das kann man folgendermassen vermeiden:

    [autoit]

    Return StringSplit(StringTrimRight($szRetValue, StringLen($szDelim)), $szDelim, 1)

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    Oscar Fehler ist behoben und im Post 1 korrigiert.

    Greenhorn, wenn man eine Funktion nicht versteht sollte man fragen bevor man anfängt grundlegende Änderungen daran vorzunehmen!
    Ich habe sie jetzt FileListRecursiv genannt damit die Funktion etwas deutlicher wird.