$search = FileFindFirstFile in Ordner und Unterordner anwendbar

  • Hallo

    bitte habt mit mir Nachsicht und Geduld. Bin ein blutiger Anfänger. ;(

    Ist es möglich, mit "$search = FileFindFirstFile($Erweiterung)" auch Ordner und Unterordner nach bestimmten Dateien zu durchsuchen?

    Das liebste wäre mir ein Feld einzufügen, wo der Benutzer einen Suchpfad mit einer Schaltfläche "Durchsuchen" angeben kann.

    Bin für alle Antworten sehr dankbar.

    Einmal editiert, zuletzt von bazii (2. Dezember 2012 um 16:35)

  • Natürlich geht das.

    [autoit]

    FileFindFirstFile("C:\Users\name22\Desktop\*.txt")

    [/autoit]


    Damit kannst du im Verzeichnis "C:\Users\name22\Desktop\" nach allen Dateien mit der .txt Endung suchen ;). Aber ich bin mir nicht sicher, ob dass das ist was du wolltest.

  • Hallo und danke für Deine Antwort.

    Das was Du mir geantwortet hast habe ich schon geschafft.

    Das Script sucht mir im Verzeichnis wo das Script liegt nach den erforderlichen Dateien, die ich brauche.

    Aber wie durchsuche ich alle sich im Verzeichnis befindlichen Ordner und Unterordner nach meinen Suchkriterien, wie beispielsweise die Dateiendung *.txt"?

  • Wenn FileFind einen Ordner findet, verändert sich der Status von @extended. Dann machst du eine Rekursion und durchsuchst alle Ordner.

    Hallo minx,

    Bitte entschuldige, doch das habe ich nun gar nicht verstanden. ;(
    Was muss ich im Quellcode einfügen, um alle Ordner und Unterordner zu durchsuchen?
    Gibt es ein Beispiel? Habe das Forum durchsucht aber irgendwie nichts gefunden was ich kapiere.

  • Hallo minx

    Ich schrieb ja schon ... Bin echt ein Anfänger ... und mit der Hilfe habe ich bereits gearbeitet, aber komme ohne zusätzliche Hilfe nicht aus.

    Zitat

    Erfolg:
    Gibt einen Dateinamen entsprechend eines früheren Aufrufes von
    FileFindFirstFile zurück. @extended wird auf 1 gesetzt, falls der Dateiname ein
    Verzeichnis ist.

    Bin einfach zu doof um das zu kapieren. :S Ich möchte nach Dateiendungen in allen Ordner und Unterordner suchen und schaffe das nicht ohne Beispiel.

    Edit: Hab nicht richtig geschaut ... und den Link übersehen. Sorry

  • Ich habe dir einen lInk gepostet, von BugFix, mit einer perfekten Funktion um nach Dateien zu suchen.

    Mit FileFind: Du rufst FileFindNextFile() in einer Schleife auf, dabei gibt diese Funktion jedes Mal eine andere Datei zurück, darunter sind auch Ordner. Wenn es einen Ordner findet, nimmt @extended den Status 1 an.

    Wenn dies der Fall ist, musst du den zurückgegebenen Pfad von FileFindNextFile() als neuen Suchpfad nehmen, also mit FileFindFirstFile()

  • Hab dir mal was gebastelt ;). Das hier ist zwar nicht die schnellste Rrekursive Suchfunktion, aber sie ist recht simpel gehalten und ähnelt deiner Version am ehesten:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $aTest = _FileFindRecursive(@UserProfileDir, "*.*", 5)
    _ArrayDisplay($aTest)

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

    Func _FileFindRecursive($sPath, $sSearch, $iDepth = 0)
    ; -Author: name22 (http://www.autoit.de)
    Local Static $iLevel = 0
    $iLevel += 1
    If $iLevel > $iDepth And $iDepth > 0 Then Return
    If StringRight($sPath, 1) <> "\" Then $sPath &= "\"
    Local $hSearch_Recursive = FileFindFirstFile($sPath & $sSearch), $sFile, $aSearchResult[1] = [0], $aTmp

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

    While True
    $sFile = FileFindNextFile($hSearch_Recursive)
    If @error Then ExitLoop
    Switch @extended
    Case 0
    $aSearchResult[0] += 1
    ReDim $aSearchResult[$aSearchResult[0] + 1]
    $aSearchResult[$aSearchResult[0]] = $sPath & $sFile
    Case 1
    $aTmp = _FileFindRecursive($sPath & $sFile, $sSearch, $iDepth)
    If UBound($aTmp) > 1 Then
    $iLastSize = $aSearchResult[0]
    $aSearchResult[0] += $aTmp[0]
    ReDim $aSearchResult[$aSearchResult[0] + 1]
    For $i = 1 To $aTmp[0]
    $aSearchResult[$iLastSize + $i] = $aTmp[$i]
    Next
    $aTmp = 0
    EndIf
    EndSwitch
    WEnd

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

    If $iLevel = 1 Then $iLevel = 0

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

    Return $aSearchResult
    EndFunc

    [/autoit]


    $iDepth steht für die Rekursionstiefe, also die Anzahl der Ebenen von Unterordnern die durchsucht werden ($iDepth = 1 durchsucht nur das angegebene Verzeichnis und ignoriert Unterordner).
    Du kannst ja mal versuchen, dass hier zu verstehen, und dann die schnelleren Funktionen von BugFix, AspirinJunkie, m-obi etc. benutzen.

  • Hallo,

    Habt vielen Dank für die schnellen, vielen und ausführlichen Antworten.

    Ich werde mich jetzt mal versuchen durch Eure Vorschläge durchzuwühlen.

    Vielleicht eines noch:
    Für den Suchpfad würde ich mir gerne ein Suchfeld bauen, das dann den Pfad der Suche enthält.
    Was nehme ich dafür am besten für ein Feld?