Ordner durchsuchen

  • Hallo,

    ich habe auf meinem Rechner einen Medienordner in welchem sich hauptsächliche meine Mp3´s befinden. Da in einigen Unterordnern Dateien rein gerutscht sind die dort nicht hingehören, wollte ich ein Script schreiben, welches alle Dateien die nicht dem Dateityp .Mp3 entsprechen in Liste mit Dateiname sowie Pfad auflistet. Leider weiß ich nicht wie ich die ganze Sache angehen soll und wollte mal wissen ob mir jemand einen Denkanstoß geben könnte.

    Danke im voraus.

    Einmal editiert, zuletzt von descent (2. Februar 2011 um 13:41)

  • Alle nicht Musikdateien eines Ordners + Unterordner
    [autoit]

    #include <Array.au3>

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

    ; Suchordner angeben:
    Global $Ordner = "D:\Musik"

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

    ; Alle Dateien in dem Ordner in ein Array zurückgeben welche nicht auf Musik-Datei-Endungen enden
    $aDateien = FlwStrRek($Ordner, "(?i).+(?<!\.(?:wma|ogg|mp3|ape|flc|aac|wav|m4a))$", 1)

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

    ; Rückgabearray anzeigen:
    _ArrayDisplay($aDateien)

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: FLwStrRek
    ; Description ...: Gibt ein Array mit Dateien bzw. Unterordnern im gesamten Verzeichnisbaum zurück
    ; Syntax.........: FLwStrRek($sSD, [$sPat = '*', [$iF = 0]])
    ; Parameters ....: $sSD - Startverzeichnis (mehrere Verzeichnisse durch | trennen)
    ; $sPat - Optional: Pattern zur Filterung mit regulären Ausdrücken
    ; $iF - Optional: Flag ob nur Dateien, Ordner oder beides gesucht werden sollen
    ; |$iF=3(Default) Gibt beides zurück
    ; |$iF=1 Gibt nur Dateien zurück
    ; |$iF=2 Gibt nur Ordner zurück
    ; $flgSS - Art der Rückgabe (Siehe StringSplit()-Funktion)
    ; Return values .: @Error: 1 = Startverzeichnis existiert nicht.
    ; |2 = ungültiger Wert für $iF
    ; Author ........: AspirinJunkie
    ; Modified.......: 12.04.2010
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; Note ..........: basiert auf einem rekursiven Ansatz
    ; ===============================================================================================================================
    Func FlwStrRek($SSD, Const $sPat = "", Const $iF = 3, Const $flgSS = 2, Const $bS = True)
    ; By AspirinJunkie
    Local $FFFF, $FFNF, $aD
    Local Static $sRet, $hDll
    If $bS Then
    $hDll = DllOpen("kernel32.dll")
    If NOT ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(1, DllClose($hDll), "")
    EndIf
    For $I In StringSplit($SSD, "|", 2)
    If StringRight($I, 1) = "\" Then $I = StringTrimRight($I, 1)
    If Not FileExists($I) Then ContinueLoop
    $FFFF = FileFindFirstFile($I & "\*")
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $I & "\" & $FFNF & "|"
    $aD = DllCall($hDll, "dword", "GetFileAttributesW", "wstr", $I & "\" & $FFNF)
    If @error Or BitAND($aD[0], 1024) Then ContinueLoop
    FlwStrRek($I & "\" & $FFNF, $sPat, $iF, 2, False)
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $I & "\" & $FFNF & "|"
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Next
    If $bS Then
    DllClose($hDll)
    Local $aRet = StringSplit(StringTrimRight($sRet, 1), "|", $flgSS)
    $sRet = ""
    Return $aRet
    EndIf
    EndFunc ;==>FlwStrRek

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (31. Januar 2011 um 22:01)

  • Danke euch, konnte mit beiden Antworten etwas Anfangen. Das Script musste ich nur etwas anpassen :thumbup:
    Das es eine solche Windowsfunktion gibt, war mir nicht bekannt - danke dafür.