Datei suchen + einlesen

  • Hallo,
    ich versuche einen Ordner mit Unterordner nach einem bestimmten Dateityp zu durchsuchen. Dieser Ordner soll frei wählbar sein und alle Pfade der gefundenen Dateien in eine Datei speichern, damit ich diese in eine ListView einlesen kann. Jedoch habe ich keine Ahnung, wie ich dies realisieren kann. Ich hatte es schon so weit, dass ich einen einzelnen Ordner durchsuchen konnte, die Unterordner jedoch unbeachtet blieben.
    Wenn mir jemand einen Denkanstoß mit einem Befehl geben könnte, würde ich mich freuen.
    Danke schon mal im Voraus für eure Mühe dies zu lesen und hoffe ihr könnt mir weiterhelfen.

    Einmal editiert, zuletzt von descent (12. Mai 2010 um 19:14)

  • Hilft dir folgendes Beispiel weiter?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $aResult = FLwStr(@SystemDir, ".+\.ini", 1)
    _ArrayDisplay($aResult)

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: FLwStr
    ; Description ...: Gibt ein Array mit Dateien bzw. Unterordnern im gesamten Verzeichnisbaum zurück
    ; Syntax.........: FLwStr($sSD, [$sPat = '*', [$iF = 0]])
    ; Parameters ....: $sSD - Startverzeichnis
    ; $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
    ; Return values .: @Error - 1 = Fehler beim erstellen der Queue
    ; |2 = Startverzeichnis existiert nicht.
    ; |3 = ungültiger Wert für $iF
    ; Author ........: AspirinJunkie
    ; Modified.......: 12.04.2010
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; Note ..........: basiert auf einem iterativen Ansatz
    ; ===============================================================================================================================
    Func FLwStr($sSD, Const $sPat = '', Const $iF = 3)
    ;by AspirinJunkie
    Local $sRet = "", $sSubD = '|' & $sSD
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')

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

    If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
    If Not FileExists($sSD) Then Return SetError(2, 0, "")
    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]

    Musst eigentlich nur noch ein $FFNF rauslöschen und schon hast du nur die Pfade in einem Array.
    Die dann in eine ListView zu bekommen sollte dann nicht mehr das Problem sein.
    Du kannst auch die Funktion so ändern das direkt die ListView-Einträge geschrieben werden statt einem Array.

    Einmal editiert, zuletzt von AspirinJunkie (10. Mai 2010 um 23:15)

  • Wieso heißt eigentlich die Funktion FLwStr? Der Sinn der Namensgebung kommt mir nicht in den Sinn ?(
    Und wenn ich einen Ordner habe mit mehreren Unterordner, dann fängt er ja hinten an. Kann man das irgendwie umstellen, dass er vorne anfängt.

  • Wieso heißt eigentlich die Funktion FLwStr? Der Sinn der Namensgebung kommt mir nicht in den Sinn

    File List with String
    Der Hinweis auf die intern vorhandene Datenstruktur im Namen kommt daher da die Funktion für einen Vergleich mit anderen Funktionen geschrieben wurde welche auf anderen Strukturen aufbauen. (Es gibt außerdem noch FLwCmd, FLwQueue, FLwStack, FLwDict und FLwDictRek ;) )

    Und wenn ich einen Ordner habe mit mehreren Unterordner, dann fängt er ja hinten an. Kann man das irgendwie umstellen, dass er vorne anfängt.


    In Ansätzen z.B. so:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: FLwStr
    ; Description ...: Gibt ein Array mit Dateien bzw. Unterordnern im gesamten Verzeichnisbaum zurück
    ; Syntax.........: FLwStr($sSD, [$sPat = '*', [$iF = 0]])
    ; Parameters ....: $sSD - Startverzeichnis
    ; $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
    ; Return values .: @Error - 1 = Fehler beim erstellen der Queue
    ; |2 = Startverzeichnis existiert nicht.
    ; |3 = ungültiger Wert für $iF
    ; Author ........: AspirinJunkie
    ; Modified.......: 07.06.2010
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; Note ..........: basiert auf einem iterativen Ansatz
    ; ===============================================================================================================================
    Func FLwStr($sSD, Const $sPat = '', Const $iF = 3)
    ;by AspirinJunkie
    Local $sRet = "", $sSubD = $sSD & '|'
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')

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

    If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
    If Not FileExists($sSD) Then Return SetError(2, 0, "")
    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
    $sDir = StringLeft($sSubD, $iC - 1)
    $sSubD = StringTrimLeft($sSubD, $iC)
    $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]

    Ansonsten denke ich sollte die rekursive Schwester dieser Funktion eher das liefern was du wolltest:

    Spoiler anzeigen
    [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
    ; $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
    ; Return values .: @Error - 1 = Fehler beim erstellen der Queue
    ; |2 = Startverzeichnis existiert nicht.
    ; |3 = 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 $bS = True)
    ;by AspirinJunkie
    Local $FFFF, $FFNF, $aD
    Local Static $sRet, $hDLL
    If $bS Then
    $hDLL = DllOpen('kernel32.dll')
    $sRet = ''
    If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
    If Not FileExists($sSD) Then Return SetError(2, 0, "")
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    EndIf
    $FFFF = FileFindFirstFile($sSD & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sSD & '\' & $FFNF & '|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sSD & '\' & $FFNF)
    If @error And BitAND($aD[0], 0x400) Then ContinueLoop
    FLwStrRek($sSD & '\' & $FFNF, $sPat, $iF, False)
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sSD & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    If $bS Then
    DllClose($hDLL)
    Local $aRet = StringSplit(StringTrimRight($sRet, 1), '|')
    $sRet = 0
    Return $aRet
    EndIf
    EndFunc

    [/autoit]


    Ansonsten bitte keine Fullquotes - danke