Alle Dateien von einem Pfad als Array zurückgeben klappt nicht!

  • Hallo,
    da ich die ursprüngliche Funktion aus versehen gelöscht hatte, musste ich selber eine neue schreiben. Also es wird ein Arrayzurückgegeben mit dem Pfad zu den einzelnen Dateien. Doch leider funktioniert das nicht, wenn man bestimmte Suchkriterien als Parameter festlegt. Beispiel "*.mp3". "*.*" funktioniert aber :/
    Mein Script mit Beispiel:

    [autoit]

    #include <Array.au3>

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

    Local $Path2Music = 'C:\Users\' & @UserName & '\Music'
    Local $Array

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

    ;Geht nicht!
    $Array = _FileSearch($Path2Music, '*.mp3') ;Bsp.1
    _ArrayDisplay($Array)

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

    ;Funktioniert!!!
    $Array = _FileSearch($Path2Music, '*.*') ;Bsp.2
    _ArrayDisplay($Array)

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

    Func _FileSearch($dir, $Ext = "*.*", $sep = "|", $flag = 0)
    Local $first = FileFindFirstFile($dir & '\' & $Ext), $next, $data ;FileFindFirstFile gibt beim 1. Bsp. -1 zurück!
    While 1
    $next = FileFindNextFile($first)
    If @error Or StringLen($next) < 1 Then ExitLoop
    If StringInStr(FileGetAttrib($dir & "\" & $next), "D") Then
    $data &= _FileSearch($dir & '\' & $next, $Ext, $sep, 1)
    Else
    $data &= $dir & '\' & $next & $sep
    EndIf
    WEnd
    FileClose($first)
    If $flag Then Return $data
    Local $split = StringSplit($data, $sep, 2)
    If UBound($split) > 1 Then ReDim $split[UBound($split) -1]
    Return $split
    EndFunc

    [/autoit]
  • Im Forum hier existieren hunderte Funktionen wie man ne Dateiliste inklusive Unterordner erstellt.
    Meisten mit dem Stichwort "rekursiv" zu finden.
    Eine Funktion von mir z.B. mit welcher du auch die Ergebnisse filtern kannst:
    (allerdings nicht mit Wildcards wie bei dir, sondern mit regulären Ausdrücken)

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name ..........: FLwStr()
    ; Description ...: Findet Dateien und/oder Ordner in einem Verzeichnisbaum
    ; Syntax ........: FLwStr($sSD, Const[ $sPat = '', Const[ $iF = 3]])
    ; Parameters ....: $sSD - Suchort (mehrere Suchorte durch | trennen)
    ; Const $sPat - [optional] regulärer Ausdruck für zu findende Datei/Ordnernamen (default:'')
    ; Const $iF - [optional] 1=nur Dateien, 2=nur Ordner, 3=Dateien+Ordner (default:3)
    ; Return values .: Success - Return Array with Matches with $Array[0] = Count
    ; Failure - Return "" and set @error
    ; Author ........: AspirinJunkie
    ; Remarks .......: Funktionsweise ist iterativ - nicht rekursiv
    ; Example .......: Yes
    ; #include <Array.au3>
    ; $aTmp = FLwStr(@WindowsDir & '|' & @ProgramFilesDir, "^Temp$", 2)
    ; _ArrayDisplay($aTmp)
    ; =================================================================================================
    Func FLwStr($sSD, Const $sPat = '', Const $iF = 3)
    ;by AspirinJunkie
    Local $sRet = "", $sSubD = ""
    For $i in StringSplit($sSD, '|', 2)
    If StringRight($i, 1) = '\' Then $i = StringTrimRight($i, 1)
    If Not FileExists($i) Then Return SetError(2, 0, "")
    $sSubD &= '|' & $i
    Next
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sDir & '\' & $FFNF & '\|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sDir & '\' & $FFNF)
    If @error And BitAND($aD[0],0x400) Then ContinueLoop
    $sSubD &= '|' & $sDir & '\' & $FFNF
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sDir & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Until 0
    DllClose($hDLL)
    Return StringSplit(StringTrimRight($sRet, 1), '|')
    EndFunc

    [/autoit]
  • Hi DeepRed92,

    Doch leider funktioniert das nicht, wenn man bestimmte Suchkriterien als Parameter festlegt.


    Ist ja auch klar :D
    Damit schließt du natürlich auch alle Unterordner mit aus!

    Erstell mal einen Unterordner mit Namen "Foobar.mp3" und schau was passiert 8)

  • Ich hab auch mal eine Funktion hingezaubert und sie funktioniert sogar :thumbup: .

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _FileListToArrayRecursiv()
    ; Description ...: Findet Dateien in einem Verzeichnis und allen Unterverzeichnissen
    ; Syntax ........: _FileListToArrayRecursiv($sPath, [$sFilter = "*"])
    ; Parameters ....: $sPath - Verzeichnispfad in dem gesucht werden soll.
    ; $sFilter - [optional] Dateinamenfilter (z.B. "*.mp3"). Wildcards werden unterstützt.
    ; Return values .: Success - Return Array with Files ($Array[0] = Count)
    ; Failure - Return 0
    ; Author ........: name22 (autoit.de)
    ; Remarks .......: Benötigt #include <File.au3>
    ; =================================================================================================
    Func _FileListToArrayRecursiv($sPath, $sFilter)
    If $sFilter = "" Then $sFilter = "*"

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

    Local $aFiles = _FileListToArray($sPath, $sFilter, 1)
    If Not IsArray($aFiles) Then
    Local $aFiles[1]
    $aFiles[0] = 0
    EndIf

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

    Local $aFolders = _FileListToArray($sPath, "*", 2)
    If Not IsArray($aFolders) Then
    If $aFiles[0] = 0 Then Return 0
    Else
    $bResult = False
    For $i = 1 To $aFolders[0]
    $aSearchTmp = _FileListToArrayRecursiv($sPath & "\" & $aFolders[$i], $sFilter)
    If IsArray($aSearchTmp) Then
    $bResult = True
    ReDim $aFiles[$aFiles[0] + $aSearchTmp[0] + 1]
    For $j = 1 To $aSearchTmp[0]
    $aFiles[$aFiles[0] + $j] = $aFolders[$i] & "\" & $aSearchTmp[$j]
    Next
    $aFiles[0] += $aSearchTmp[0]
    EndIf
    Next
    If Not $bResult Then Return 0
    EndIf

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

    Return $aFiles
    EndFunc

    [/autoit]