Hallo, gibt es vllt. schon eine fertige Funktion o.ä. um einen Verzeichnisbaum incl. Unterverzeichnisse zu durchsuchen um leere Ordner zu finden und diese dann zu löschen?
Danke
Funktion um leere Verzeichnisse zu finden gesucht
-
- [ gelöst ]
-
igillan -
4. August 2010 um 14:26 -
Geschlossen -
Erledigt
-
-
Vorschlag fürs finden:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]$aDirs = FindEmptyDirs(@WindowsDir)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aDirs, "Leere Verzeichnisse")Func FindEmptyDirs($sSD, Const $bS = True)
[/autoit]
;by AspirinJunkie
Local $FFFF, $FFNF, $aD
Local Static $sRet
If $bS Then $sRet = ''
$FFFF = FileFindFirstFile($sSD & '\*')
If @error Then
$sRet &= $sSD & '|'
Else
Do
$FFNF = FileFindNextFile($FFFF)
If @error Then ExitLoop
If @extended Then
FindEmptyDirs($sSD & '\' & $FFNF, False)
EndIf
Until 0
FileClose($FFFF)
EndIf
If $bS Then
Local $aRet = StringSplit(StringTrimRight($sRet, 1), '|', 2)
$sRet = 0
Return $aRet
EndIf
EndFunc -
Danke für die super Antwort. Bloß.... wie lösche ich jetzt z.B. mit DirRemove die gefundenen Verzeichnisse?
-
- Offizieller Beitrag
Du erhältst doch ein Array mit den leeren Verzeichnissen - einfach jedes Element mit DirRemove löschen.
-
Du erhältst doch ein Array mit den leeren Verzeichnissen - einfach jedes Element mit DirRemove löschen.
Sorry, wenn ich nerve aber da ist ja mein Problem . wie wähle ich alle Elemente aus und lösche sie dann? -
Du wählst nicht alle Elemente auf einmal auf sondern gehst das Array durch und löschst jedes einzeln.
Ich denke du hast noch bisschen Schwierigkeiten mit Arrays umzugehen?
Wenn ja solltest du dir dies erstmal anschauen (von BugFix): >>Array-Tutorial<<Wenn du das durchgelesen hast und probiert hast wie du dein Problem mit Arrays löst, dann (wirklich nur dann) noch eine abgewandelte Form bei welcher die Verzeichnisse direkt gelöscht werden:
Spoiler anzeigen
[autoit]Func DelEmptyDirs($sSD)
[/autoit]
;by AspirinJunkie
Local $FFFF, $FFNF
If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
$FFFF = FileFindFirstFile($sSD &'\*')
If @error = 1 Then
DirRemove($sSD)
ElseIf $FFFF <> -1 Then
Do
$FFNF = FileFindNextFile($FFFF)
If @error Then ExitLoop
If @extended Then DelEmptyDirs($sSD & '\' & $FFNF)
Until 0
FileClose($FFFF)
EndIf
EndFunc -
[autoit]
#include <Array.au3>
[/autoit][autoit][/autoit][autoit]$aDirs = FindEmptyDirs(@WindowsDir)
[/autoit][autoit][/autoit][autoit]
_ArrayDisplay($aDirs, "Leere Verzeichnisse")
For $i=0 to Ubound($aDirs)-1
DirRemove($aDirs[$i])
NextFunc FindEmptyDirs($sSD, Const $bS = True)
[/autoit][autoit][/autoit][autoit]
;by AspirinJunkie
Local $FFFF, $FFNF, $aD
Local Static $sRet, $hDLL
If $bS Then
$hDLL = DllOpen('kernel32.dll')
$sRet = ''
EndIfFor $i In StringSplit($sSD, '|', 2)
[/autoit][autoit][/autoit][autoit]
If StringRight($i, 1) = '\' Then $i = StringTrimRight($i, 1)
If Not FileExists($i) Then ContinueLoop$FFFF = FileFindFirstFile($i & '\*')
[/autoit]
If $FFFF <> -1 Then
Do
$FFNF = FileFindNextFile($FFFF)
If @error Then ExitLoop
If @extended Then
FileFindFirstFile($i & '\' & $FFNF & '\*')
If @error Then
$sRet &= $i & '\' & $FFNF & '|'
Else
$aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $i & '\' & $FFNF)
If @error And BitAND($aD[0], 0x400) Then ContinueLoop
FindEmptyDirs($i & '\' & $FFNF, False)
EndIf
EndIf
Until 0
FileClose($FFFF)
EndIf
Next
If $bS Then
DllClose($hDLL)
Local $aRet = StringSplit(StringTrimRight($sRet, 1), '|', 2)
$sRet = 0
Return $aRet
EndIf
EndFunc -
AspirinJunkie
Vielen Dank für den Tipp mit dem Tuturial. Mein Problem war, das ich die "ArrayNummer" in runde statt in eckige Klammern gesetzt habe. Jetzt funzt es! Vielen Dank