Löschen von mehreren Dateien mit _RecursiveFileSearch (BugFix UDF)

  • Hallo, ich habe folgendes Script und versuche damit mehrere Dateien mit dem gleichen Namen, in diesem Fall test.txt, zu löschen.

    Folgendes Problem:

    Er löscht immer nur die Datei, die er als letztes gefunden hat.

    Raupi und SEuBo konnten mir noch nicht richtig helfen.

    SEuBo hat zwar bereits ein Script mit einer anderen UDF gezeigt, welches aus funktioniert, aber länger dauert.

    Das lässt sich sicherlich noch optimieren.

    Hier das Script:

    Spoiler anzeigen
    [autoit]

    #Include <Array.au3>
    $Datei = "test.txt"
    Dim $aResult[1]
    Global $Result
    $var = DriveGetDrive( "FIXED" )
    If NOT @error Then
    For $i = 1 to $var[0]
    If $var[$i] = "a:" or $var[$i] = "b:" Then ContinueLoop
    $Result= _RecursiveFileSearch($Datei, $var[$i]&"\")
    If $Result <> 4 Then
    _ArrayAdd($aResult,$Result)
    Endif
    Next
    EndIf
    _ArrayDisplay($aResult)
    For $i = 1 to UBound ($aResult)-1
    FileDelete($aResult[$i])
    Next
    ;--------------------------------------------------------------------------------------------------
    ; 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]

    MfG


    PS: Bei ArrayDisplay zeigt er noch nicht einmal den richtigen Pfad, von der einzigen gefundenen Datei an, obwohl er die eine von den zweien löscht.

    • Offizieller Beitrag

    Wenn die Dateien im Hauptverzeichnis des Laufwerk liegen funktioniert _RecursiveFileSearch nicht.

    Damit findet es auch Dateien im Hauptverzeichnis:

    Spoiler anzeigen
    [autoit]

    #Include <Array.au3>
    $Datei = "ert.au3"
    Dim $aResult[1]
    Global $Result
    $var = DriveGetDrive( "FIXED" )

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

    If NOT @error Then
    For $i = 1 to $var[0]
    If $var[$i] = "a:" or $var[$i] = "b:" Then ContinueLoop
    $Result= _RecursiveFileSearch($Datei, $var[$i]&"\")
    if $Result <> 4 Then
    _ArrayAdd($aResult,$Result)
    Endif
    Next
    EndIf
    _ArrayDisplay($aResult)
    For $i = 1 to UBound ($aResult)-1
    FileDelete($aResult[$i])
    Next
    ;--------------------------------------------------------------------------------------------------
    ; 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]
    • Offizieller Beitrag

    Hab mal die Funktion von BugFix ein bischen misbraucht und umgeschrieben, Jetzt werden alle Dateivorkommen in allen Laufwerken gefunden.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $Datei = "Test.txt"
    Dim $aResult[1]
    Global $Result
    $var = DriveGetDrive("ALL")

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

    If Not @error Then
    For $i = 1 To $var[0]
    If $var[$i] = "a:" Or $var[$i] = "b:" Then ContinueLoop
    $Result = _RecursiveFileSearch($Datei, $var[$i] & "\")
    If IsArray($Result) Then
    For $j = 1 To $Result[0]
    _ArrayAdd($aResult, $Result[$j])
    Next
    $aResult[0] = UBound($aResult) - 1
    EndIf

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

    Next
    EndIf
    _ArrayDisplay($aResult)
    If $aResult[0] > 0 Then
    For $i = 1 To UBound($aResult) - 1
    FileDelete($aResult[$i])
    Next
    EndIf
    ;--------------------------------------------------------------------------------------------------
    ; 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]) Modify by ([email='raupi@autoit.de'][/email])
    ;--------------------------------------------------------------------------------------------------
    Func _RecursiveFileSearch($FILE, $SEARCHFOLDER)
    Dim $aPath[1]
    $aPath[0] = 0
    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
    _ArrayAdd($aPath, $SEARCHFOLDER & $FILE)
    $aPath[0] = UBound($aPath) - 1
    EndIf
    $FSO = ObjCreate("Scripting.FileSystemObject")
    ShowSubfolders($FSO.GetFolder($SEARCHFOLDER), $FILE, $aPath)

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

    If $aPath[0] = 0 Then
    SetError(1)
    $Fehler = 4
    Return $Fehler
    Else
    SetError(0)
    EndIf
    Return $aPath
    EndFunc ;==>_RecursiveFileSearch

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

    Func ShowSubFolders($Folder, $FILE, ByRef $aPath)
    For $Subfolder In $Folder.SubFolders
    If FileExists($Subfolder.Path & "\" & $FILE) Then
    $PathFound = $Subfolder.Path & "\" & $FILE
    _ArrayAdd($aPath, $PathFound)
    $aPath[0] = UBound($aPath) - 1
    EndIf
    ShowSubFolders($Subfolder, $FILE, $aPath)
    Next
    EndFunc ;==>ShowSubFolders
    ; ==>_RecursiveFileSearch

    [/autoit]