Dateipfad in Unterordner finden

  • Hallo zusammen

    Gibt es eine möglichkeit vom Dateinamen der z.B. FileFindNextFile zurückgibt, den gesamten Dateipfad der Datei zu erhalten, auch wenn die sich noch in Unterordnern befindet? Hab alles versucht aber bin bis jetzt nicht drauf gekommen.

    Beispiel:

    Ich möchte im Ordner "C:\Ordner" nach "test.txt" suchen.
    "test.txt" befindet jedoch in "C:\Ordner\Unterordner", was ich natürlich nicht weis.
    Wie mache ich es jetzt dass es mir "C:\Ordner\Unterordner\test.txt" ausgibt?

    • Offizieller Beitrag
  • Der Ansatz ist schon sehr gut. Gibt es so etwas auch noch so, dass man Wildcards wie * benutzen kann?
    Wäre noch wichtig...

  • Hab folgendes hier mal im forum gefunden gehabt.
    Vielleicht hilft Dir das ja erstmal.
    Mußt nur $fpath & $SucheDatei angeben.
    Bekommst als Ergebnis eine Suchergebnis.txt Datei.

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    Global $Files, $SucheDatei
    _Suche_Datei ()

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

    Func _Suche_Datei ()
    $fpath = "c:\"
    $SucheDatei = "\*.exe"
    If Not @error Then
    If StringRight($fpath, 1) <> '\' Then $fpath &= '\'
    _FileListToString($fpath)
    Global $aFileList = StringSplit($Files, '|'); Array $aFileList enthält Auflistung aller Unterverzeichnisse
    _FileWriteFromArray(@ScriptDir & "\Suchergebnis.txt", $aFilelist, 1)
    $TXT_Lesen = @ScriptDir & "\Suchergebnis.txt"
    $Files = ""
    EndIf
    ShellExecute("Suchergebnis.txt", "", @ScriptDir)

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

    EndFunc

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

    Func _FileListToString($path)
    Local $hSearch, $sFile
    $hSearch = FileFindFirstFile($path & $SucheDatei)
    If $hSearch <> -1 Then
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    SetError(0)
    ExitLoop
    EndIf
    If StringInStr(FileGetAttrib($path & $sFile), "D") <> 0 Then ContinueLoop

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

    $Files &= $path & $sFile & '|'
    WEnd
    FileClose($hSearch)
    EndIf
    _ReFileListToString($path)
    $Files = StringTrimRight($Files, 1)
    EndFunc

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

    Func _ReFileListToString($path); Diese Funktion nicht direkt aufrufen. Wird nur von _FileListToString benutzt.
    Local $dFileList = _FileListToArray($path, '*', 2)
    If IsArray($dFileList) Then
    For $i = 1 To $dFileList[0]
    Local $hSearch, $sFile
    $hSearch = FileFindFirstFile($path & $dFileList[$i] & $SucheDatei)
    If $hSearch <> -1 Then
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    SetError(0)
    ExitLoop
    EndIf
    If StringInStr(FileGetAttrib($path & $dFileList[$i] & "\" & $sFile), "D") <> 0 Then ContinueLoop
    $Files &= $path & $dFileList[$i] & "\" & $sFile & '|'
    WEnd
    FileClose($hSearch)
    EndIf
    _ReFileListToString($path & $dFileList[$i] & '\')
    Next
    EndIf
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Hier mal eine Kurzversion:

    Spoiler anzeigen
    [autoit]


    $sResult = _RecursiveFileSearch('c:', 'UDF.*\.chm')
    If $sResult <> '' Then ConsoleWrite('Datei gefunden: "' & $sResult & '"' & @CR)

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

    Func _RecursiveFileSearch($sPath, $sSearch = '.*')
    Local $hSearch, $sFile, $sRet
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    If Not FileExists($sPath) Then Return SetError(1, 0, '')
    $hSearch = FileFindFirstFile($sPath & '*')
    If $hSearch = -1 Then Return SetError(2, 0, '')
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $sRet = _RecursiveFileSearch($sPath & $sFile, $sSearch)
    If $sRet <> '' Then ExitLoop
    EndIf
    If StringRegExp($sFile, $sSearch) Then
    $sRet = $sPath & $sFile
    ExitLoop
    EndIf
    WEnd
    FileClose($hSearch)
    Return $sRet
    EndFunc

    [/autoit]


    Da kannst Du ein beliebiges RegExpPattern benutzen.