Rekursive Dateisuche per Objekt

    • Offizieller Beitrag

    Hier mal eine andere Variante zur Rekursiven Dateisuche. Diesmal mit Objekt gelöst.
    Konkret: Funktion um eine Datei rekursiv in einem Pfad zu suchen. Rückgabe - der Dateipfad.

    Spoiler anzeigen
    [autoit]

    Dim $Datei = "autoit3.exe"
    Dim $Ordner = @ProgramFilesDir
    MsgBox(0, '', _RecursiveFileSearch($Datei, $Ordner) )

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

    ;--------------------------------------------------------------------------------------------------
    ; Funktion _RecursiveFileSearch($FILE, $SEARCHFOLDER)
    ;
    ; Beschreibung Sucht nach vorgegebener Datei in einem Ordner rekursiv
    ;
    ; Parameter $FILE: zu suchende Datei
    ; $SEARCHFOLDER: Ordner für Suchstart
    ;
    ; Rückgabe Erfolg: Pfad der gesuchten Datei
    ; @error = 0
    ; Fehler: 1-kein Dateiname / 2-kein Ordnername übergeben (3-beides); 4-Datei nicht vorhanden
    ; @error = 1
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;--------------------------------------------------------------------------------------------------
    Func _RecursiveFileSearch($FILE, $SEARCHFOLDER)
    Global $PathFound = ""
    Dim $Fehler = 0
    If $FILE = "" Then
    SetError(1)
    $Fehler += 1
    EndIf
    If $SEARCHFOLDER = "" Then
    SetError(1)
    $Fehler += 2
    EndIf
    If @error Then Return $Fehler
    $FSO = ObjCreate("Scripting.FileSystemObject")
    ShowSubfolders( $FSO.GetFolder($SEARCHFOLDER), $FILE )
    If $PathFound = "" Then
    SetError(1)
    $Fehler = 4
    Return $Fehler
    Else
    SetError(0)
    EndIf
    Return $PathFound
    EndFunc
    Func ShowSubFolders($Folder, $FILE)
    For $Subfolder in $Folder.SubFolders
    If FileExists($Subfolder.Path & "\" & $FILE) Then
    $PathFound = $Subfolder.Path & "\" & $FILE
    ExitLoop
    EndIf
    ShowSubFolders( $Subfolder, $FILE )
    Next
    EndFunc
    ; ==>_RecursiveFileSearch

    [/autoit]
    • Offizieller Beitrag

    Hi,

    sieht sehr gut aus :)

    Ich habs mal so angepaßt (NICHT unbedingt besser!!!)

    Spoiler anzeigen
    [autoit]

    Global $Datei = "autoit3.chm"
    MsgBox(0, '', _RecursiveFileSearch($Datei))

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

    Func _RecursiveFileSearch($FILE, $SEARCHFOLDER = 'c:\')
    Global $PathFound
    If $FILE = '' Then Return -1
    $FSO = ObjCreate('Scripting.FileSystemObject')
    If @error Then Return -2
    ShowSubFolders($FSO.GetFolder ($SEARCHFOLDER), $FILE)
    If $PathFound = '' Then Return -3
    Return $PathFound
    EndFunc ;==>_RecursiveFileSearch

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

    Func ShowSubFolders($Folder, $FILE)
    For $Subfolder In $Folder.SubFolders
    If FileExists($Subfolder.Path & '\' & $FILE) Then
    $PathFound = $Subfolder.Path & '\' & $FILE
    ExitLoop
    EndIf
    ShowSubFolders($Subfolder, $FILE)
    Next
    EndFunc ;==>ShowSubFolders

    [/autoit]

    So long,

    Mega

  • Hallo.

    Habe gerade mal bisschen was über "Rekursiven Programmierung" gelesen. Wenn ich das also richtig verstanden habe, bedeutet es doch, das man bei Faktor vier auch vier mal ein Ergebnis bekommt und mit dieser vier Ergebnissen arbeiten könnte. Oder habe ich es falsch verstanden?
    Gelesene Quelle: http://de.wikipedia.org/wiki/Rekursive_Programmierung

    Bin mal gespannt, ob ich das richtig verstanden habe.

    LG Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag
    Zitat

    Ich habs mal so angepaßt (NICHT unbedingt besser!!!)

    Minimieren ist immer gut ;)

    Eins aber noch zur Ergänzung, sollte die gesuchte Datei mehrfach vorhanden sein, wird nur die erste gefundene Instanz zurückgegeben (war auch mein Anliegen um die Suchzeit zu minimieren).
    Kann natürlich abgeändert werden (Megas Änderung noch nicht enthalten):

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    Dim $Datei = "autoit3.exe"
    Dim $Ordner = @ProgramFilesDir
    Dim $Ret
    $Ret = _RecursiveFileSearch($Datei, $Ordner)
    If $Ret[0] > 1 Then
    _ArrayDisplay($Ret, "")
    Else
    MsgBox(0, '', $Ret[1] )
    EndIf

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

    ;--------------------------------------------------------------------------------------------------
    ; Funktion _RecursiveFileSearch($FILE, $SEARCHFOLDER)
    ;
    ; Beschreibung Sucht nach vorgegebener Datei in einem Ordner rekursiv
    ;
    ; Parameter $FILE: zu suchende Datei
    ; $SEARCHFOLDER: Ordner für Suchstart
    ;
    ; Rückgabe Erfolg: Array mit Pfad(en) der gesuchten Datei
    ; @error = 0
    ; Fehler: 1-kein Dateiname / 2-kein Ordnername übergeben (3-beides); 4-Datei nicht vorhanden
    ; @error = 1
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;--------------------------------------------------------------------------------------------------
    Func _RecursiveFileSearch($FILE, $SEARCHFOLDER)
    Global $Out = "" ;$PathFound = ""
    Dim $Fehler = 0
    If $FILE = "" Then
    SetError(1)
    $Fehler += 1
    EndIf
    If $SEARCHFOLDER = "" Then
    SetError(1)
    $Fehler += 2
    EndIf
    If @error Then Return $Fehler
    $FSO = ObjCreate("Scripting.FileSystemObject")
    ShowSubfolders( $FSO.GetFolder($SEARCHFOLDER), $FILE )
    ;~ If $PathFound = "" Then
    If $Out = "" Then
    SetError(1)
    $Fehler = 4
    Return $Fehler
    Else
    SetError(0)
    EndIf
    $Out = StringSplit(StringTrimRight($Out, 1), "|")
    Return $Out
    ;~ Return $PathFound
    EndFunc
    Func ShowSubFolders($Folder, $FILE)
    For $Subfolder In $Folder.SubFolders
    If FileExists($Subfolder.Path & '\' & $FILE) Then
    $Out &= $Subfolder.Path & '\' & $FILE & "|"
    ; $PathFound = $Subfolder.Path & '\' & $FILE
    ; ExitLoop
    EndIf
    ShowSubFolders($Subfolder, $FILE)
    Next
    EndFunc
    ; ==>_RecursiveFileSearch

    [/autoit]

    Also von der Gesamtsuchzeit her ist glaub ich kein Zeitgewinn zu verzeichnen. Aber der Code ist einfacher zu handeln als die Strukturen mit 'FileFindFirstFile - FileFindNextFile'.

    • Offizieller Beitrag

    Hi!

    Alina:
    Bei Rekursion geht es darum, dass eine Funktion sich selbst aufruft. Damit lässt sich manches etwas besser lesbar programmieren. Aber es gibt dennoch nur ein Ergebnis zurück, unabhängig vom Startwert (in diesem Fall). Denn wie bei Wiki gezeigt wird immer wieder zurückgehangelt, bis man wieder beim Ursprungsaufruf landet und dort das Ergebnis zurückgibt.

    peethebee

  • Ich würde gerne mit der Funktion mehrere Dateien in mehreren Ordnern suchen.
    Mit einer ist es ja kein Problem.

    Ich suche z.B. die Datei abc.exe und xyz.exe auf C: und auf D: wie kann ich das anstellen.

    Und möchte das ganze loggen in einer txt zum Beispiel.

    Hoffe ihr versteht mich einigermassen ^^


    LG

    Schnuecks

    • Offizieller Beitrag

    Ich würde gerne mit der Funktion mehrere Dateien in mehreren Ordnern suchen.
    Mit einer ist es ja kein Problem.

    Mit mehreren auch nicht. ;)
    Abarbeiten in einer Schleife, könntest du so machen (Suchfunktion ist hier eine andere, kannst ja testen welche schneller ist.):

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $aToSearch[2][2] = [['abc.exe','C:|D:'],['xyz.exe','C:']] ; z.b. abc.exe in C: und D:, xyz.exe nur in C: suchen
    Global $aPath[2], $aFound[1] = [0]

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

    For $i = 0 To UBound($aToSearch) -1
    If StringInStr($aToSearch[$i][1], '|') Then
    $aPath = StringSplit($aToSearch[$i][1], '|')
    Else
    $aPath[1] = $aToSearch[$i][1]
    EndIf
    For $j = 1 To UBound($aPath) -1
    If $aFound[UBound($aFound)-1] <> 0 Then ReDim $aFound[UBound($aFound)+1]
    $aFound[UBound($aFound)-1] = _SearchTreeForFile($aPath[$j], $aToSearch[$i][0])
    Next
    Next
    If $aFound[0] Then
    _ArrayDisplay($aFound, 'Ergebnis Dateisuche')
    Else
    MsgBox(0, 'Dateisuche', 'Keine der Dateien wurde in den angegebenen Pfaden gefunden.')
    EndIf

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

    ;===============================================================================
    ; Function Name: _SearchTreeForFile($sRootPath, $sFileName)
    ; Description:: Dateisuche in einem Pfad und allen Unterpfaden
    ; Parameter(s): $sRootPath Startpfad der Suche
    ; $sFileName Name der gesuchten Datei
    ; Return Value(s): gefunden Pfad der gesuchten Datei
    ; n. gefunden 0
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _SearchTreeForFile($sRootPath, $sFileName)
    If StringRight($sRootPath, 1) <> '\' Then $sRootPath &= '\'
    Local $sOutputPathBuffer = ''
    Local $aRet = DllCall("imagehlp", 'long', 'SearchTreeForFile', 'str', _
    $sRootPath, 'str', $sFileName, 'str', $sOutputPathBuffer)
    If $aRet[0] = 1 Then
    Return $aRet[3]
    Else
    Return 0
    EndIf
    EndFunc ;==>_SearchTreeForFile

    [/autoit]
  • Was ist hier dran falsch?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $aToSearch[2][2] = [['xyz.exe','C:'],['xyz.exe','D:']] ; z.b. abc.exe in C: und D:, xyz.exe nur in C: suchen
    Global $aPath[2], $aFound[1] = [0]

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

    For $i = 0 To UBound($aToSearch) -1
    If StringInStr($aToSearch[$i][1], '|') Then
    $aPath = StringSplit($aToSearch[$i][1], '|')
    Else
    $aPath[1] = $aToSearch[$i][1]
    EndIf
    For $j = 1 To UBound($aPath) -1
    If $aFound[UBound($aFound)-1] <> 0 Then ReDim $aFound[UBound($aFound)+1]
    $aFound[UBound($aFound)-1] = _SearchTreeForFile($aPath[$j], $aToSearch[$i][0])
    Next
    Next
    If $aFound[0] Then
    _ArrayDisplay($aFound, 'Ergebnis Dateisuche')
    Else
    MsgBox(0, 'Dateisuche', 'Keine der Dateien wurde in den angegebenen Pfaden gefunden.')
    EndIf

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

    ;===============================================================================
    ; Function Name: _SearchTreeForFile($sRootPath, $sFileName)
    ; Description:: Dateisuche in einem Pfad und allen Unterpfaden
    ; Parameter(s): $sRootPath Startpfad der Suche
    ; $sFileName Name der gesuchten Datei
    ; Return Value(s): gefunden Pfad der gesuchten Datei
    ; n. gefunden 0
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _SearchTreeForFile($sRootPath, $sFileName)
    If StringRight($sRootPath, 1) <> '\' Then $sRootPath &= '\'
    Local $sOutputPathBuffer = ''
    Local $aRet = DllCall("imagehlp", 'long', 'SearchTreeForFile', 'str', _
    $sRootPath, 'str', $sFileName, 'str', $sOutputPathBuffer)
    If $aRet[0] = 1 Then
    Return $aRet[3]
    Else
    Return 0
    EndIf
    EndFunc ;==>_SearchTreeForFile

    [/autoit]

    Es findet nur D: xyz.exe aber nicht C: xyz.exe vertausch ich die beiden findete er die Sachen von C: aber nicht von D:


    LG

    Schnuecks

    2 Mal editiert, zuletzt von Schnuecks (2. März 2009 um 14:51)

  • Das funktioniert jetzt soweit.

    Er zeigt aber immer nur die zuerst gefundene an. Beispiel

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $aToSearch[2][2] = [['xyz.exe','C:|D:|E:']] ; z.b. abc.exe in C: und D:, xyz.exe nur in C: suchen
    Global $aPath[2], $aFound[1] = [0]

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

    For $i = 0 To UBound($aToSearch) -1
    If StringInStr($aToSearch[$i][1], '|') Then
    $aPath = StringSplit($aToSearch[$i][1], '|')
    Else
    $aPath[1] = $aToSearch[$i][1]
    EndIf
    For $j = 1 To UBound($aPath) -1
    If $aFound[UBound($aFound)-1] Then ReDim $aFound[UBound($aFound)+1]
    $aFound[UBound($aFound)-1] = _SearchTreeForFile($aPath[$j], $aToSearch[$i][0])
    Next
    Next
    If $aFound[0] Then
    _ArrayDisplay($aFound, 'Ergebnis Dateisuche')
    Else
    MsgBox(0, 'Dateisuche', 'Keine der Dateien wurde in den angegebenen Pfaden gefunden.')
    EndIf

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

    ;===============================================================================
    ; Function Name: _SearchTreeForFile($sRootPath, $sFileName)
    ; Description:: Dateisuche in einem Pfad und allen Unterpfaden
    ; Parameter(s): $sRootPath Startpfad der Suche
    ; $sFileName Name der gesuchten Datei
    ; Return Value(s): gefunden Pfad der gesuchten Datei
    ; n. gefunden 0
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _SearchTreeForFile($sRootPath, $sFileName)
    If StringRight($sRootPath, 1) <> '\' Then $sRootPath &= '\'
    Local $sOutputPathBuffer = ''
    Local $aRet = DllCall("imagehlp", 'long', 'SearchTreeForFile', 'str', _
    $sRootPath, 'str', $sFileName, 'str', $sOutputPathBuffer)
    If $aRet[0] = 1 Then
    Return $aRet[3]
    Else
    Return 0
    EndIf
    EndFunc ;==>_SearchTreeForFile

    [/autoit]

    Die Datei xyz.exe existiert im Beispiel mehrmals auf Laufwerk C:, Laufwerk D: und E: passen.
    Was muss ich machen damit alle gefunden angezeigt werden.

    Ergebniss:

    Spoiler anzeigen

    [0]|C:\Intel\xyz.exe
    [1]|D:\xyz.exe
    [2]|E:\javahelp\xyz.exe
    [3]|0

    Mach ich noch etwas falsch?

    LG
    Schnuecks

    • Offizieller Beitrag

    Die Datei xyz.exe existiert im Beispiel mehrmals auf Laufwerk C:


    Also mehrfaches Auftreten einer Datei in einem Pfad kann hiermit nicht gefunden werden. Diese Suchmethode gibt immer nur die erste gefundene Instanz zurück.
    Wenn du mehrfaches Auftreten finden willst, benötigst du eine Variante, die FileFindFirstFile ...NextFile verwendet.

  • Ok mehrfach brauch ich nicht unbedingt.

    Aber mir ist folgendes aufgefallen

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $aToSearch[2][2] = [['test.exe','C:|D:'],['test.jar','C:']]
    Global $aPath[2], $aFound[1] = [0]

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

    For $i = 0 To UBound($aToSearch) -1
    If StringInStr($aToSearch[$i][1], '|') Then
    $aPath = StringSplit($aToSearch[$i][1], '|')
    Else
    $aPath[1] = $aToSearch[$i][1]
    EndIf
    For $j = 1 To UBound($aPath) -1
    If $aFound[UBound($aFound)-1] Then ReDim $aFound[UBound($aFound)+1]
    $aFound[UBound($aFound)-1] = _SearchTreeForFile($aPath[$j], $aToSearch[$i][0])
    Next
    Next
    If $aFound[0] Then
    _ArrayDisplay($aFound, 'Ergebnis Dateisuche')
    Else
    MsgBox(0, 'Dateisuche', 'Keine der Dateien wurde in den angegebenen Pfaden gefunden.')
    EndIf

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

    ;===============================================================================
    ; Function Name: _SearchTreeForFile($sRootPath, $sFileName)
    ; Description:: Dateisuche in einem Pfad und allen Unterpfaden
    ; Parameter(s): $sRootPath Startpfad der Suche
    ; $sFileName Name der gesuchten Datei
    ; Return Value(s): gefunden Pfad der gesuchten Datei
    ; n. gefunden 0
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _SearchTreeForFile($sRootPath, $sFileName)
    If StringRight($sRootPath, 1) <> '\' Then $sRootPath &= '\'
    Local $sOutputPathBuffer = ''
    Local $aRet = DllCall("imagehlp", 'long', 'SearchTreeForFile', 'str', _
    $sRootPath, 'str', $sFileName, 'str', $sOutputPathBuffer)
    If $aRet[0] = 1 Then
    Return $aRet[3]
    Else
    Return 0
    EndIf
    EndFunc ;==>_SearchTreeForFile

    [/autoit]

    Ergebniss

    Spoiler anzeigen

    [0]|C:\test.exe
    [1]|D:\test.exe
    [2]|C:\test.jar
    [3]|D:\test.jar

    Frage warum findet er die Datei test.jar auf C: und D: beim zweiten obwohl nur C: angegeben ist?

    LG
    Schnuecks

  • Also wenn Du die Suchreihenfolge wie folgt änderst bekommst Du das richtige Ergebnissssss. ;)

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Global $aToSearch[2][2] = [['222222.jar','E:'],['111111.exe','E:|F:']]
    Global $aPath[2], $aFound[1] = [0]

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

    For $i = 0 To UBound($aToSearch) -1
    If StringInStr($aToSearch[$i][1], '|') Then
    $aPath = StringSplit($aToSearch[$i][1], '|')
    Else
    $aPath[1] = $aToSearch[$i][1]
    EndIf
    For $j = 1 To UBound($aPath) -1
    If $aFound[UBound($aFound)-1] Then ReDim $aFound[UBound($aFound)+1]
    $aFound[UBound($aFound)-1] = _SearchTreeForFile($aPath[$j], $aToSearch[$i][0])
    Next
    Next
    If $aFound[0] Then
    _ArrayDisplay($aFound, 'Ergebnis Dateisuche')
    Else
    MsgBox(0, 'Dateisuche', 'Keine der Dateien wurde in den angegebenen Pfaden gefunden.')
    EndIf

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

    ;===============================================================================
    ; Function Name: _SearchTreeForFile($sRootPath, $sFileName)
    ; Description:: Dateisuche in einem Pfad und allen Unterpfaden
    ; Parameter(s): $sRootPath Startpfad der Suche
    ; $sFileName Name der gesuchten Datei
    ; Return Value(s): gefunden Pfad der gesuchten Datei
    ; n. gefunden 0
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _SearchTreeForFile($sRootPath, $sFileName)
    If StringRight($sRootPath, 1) <> '\' Then $sRootPath &= '\'
    Local $sOutputPathBuffer = ''
    Local $aRet = DllCall("imagehlp", 'long', 'SearchTreeForFile', 'str', _
    $sRootPath, 'str', $sFileName, 'str', $sOutputPathBuffer)
    If $aRet[0] = 1 Then
    Return $aRet[3]
    Else
    Return 0
    EndIf
    EndFunc ;==>_SearchTreeForFile

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Wirklich 'ne prima Funktion ! :)

    Und sehr schnell noch dazu.
    Die andere Funktion SearchTreeForFile scheint etwas schneller zu sein, ist aber leider auf Dateien beschränkt und nicht für eine Ordnersuche geeignet.

    Danke für diese nützlichen Funktionen. :)


    LG
    Greenhorn


    • Offizieller Beitrag

    BugFix , hab einen Bug in deine Funktion gefunden der gefixt werden muß. :thumbup:

    Wenn sich die zu suchende Datei sich im Hauptverzeichnis eines Laufwerkes befindet, wird sie nicht gefunden.

    Hier meine Version:

    Spoiler anzeigen
    [autoit]

    ;--------------------------------------------------------------------------------------------------
    ; Funktion _RecursiveFileSearch($FILE, $SEARCHFOLDER)
    ;
    ; Beschreibung Sucht nach vorgegebener Datei in einem Ordner rekursiv
    ;
    ; Parameter $FILE: zu suchende Datei
    ; $SEARCHFOLDER: Ordner für Suchstart
    ;
    ; Rückgabe Erfolg: Pfad der gesuchten Datei
    ; @error = 0
    ; Fehler: 1-kein Dateiname / 2-kein Ordnername übergeben (3-beides); 4-Datei nicht vorhanden
    ; @error = 1
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;--------------------------------------------------------------------------------------------------
    Func _RecursiveFileSearch($FILE, $SEARCHFOLDER)
    Global $PathFound = ""
    Dim $Fehler = 0
    If $FILE = "" Then
    SetError(1)
    $Fehler += 1
    EndIf
    If $SEARCHFOLDER = "" Then
    SetError(1)
    $Fehler += 2
    EndIf
    If @error Then Return $Fehler
    If FileExists($SEARCHFOLDER & $FILE) Then
    Return $SEARCHFOLDER & $FILE
    EndIf
    $FSO = ObjCreate("Scripting.FileSystemObject")
    ShowSubfolders( $FSO.GetFolder($SEARCHFOLDER), $FILE )

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

    If $PathFound = "" Then
    SetError(1)
    $Fehler = 4
    Return $Fehler
    Else
    SetError(0)
    EndIf
    Return $PathFound
    EndFunc

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

    Func ShowSubFolders($Folder, $FILE)
    For $Subfolder in $Folder.SubFolders
    If FileExists($Subfolder.Path & "\" & $FILE) Then
    $PathFound = $Subfolder.Path & "\" & $FILE
    ExitLoop
    EndIf
    ShowSubFolders( $Subfolder, $FILE )
    Next
    EndFunc
    ; ==>_RecursiveFileSearch

    [/autoit]