# Leere Verzeichnisse löschen



## RungetSvohu (21. Sep 2012)

Hallo Leute,

ich habe mir eben ein Programm geschrieben, dass einen Ordner auf meinem Rechner nach leeren Verzeichnissen durchsucht, diese dann ausgibt und falls erwünscht über eine zusätzliche Methode entfernt. Leer ist für mich ein Verzeichnis, wenn dort keine Dateien drin sind (egal in welcher Ebene darunter). Jeder Unterordner eines leeren Verzeichnisses beinhaltet also (wenn überhaupt) auch nur leere Verzeichnisse. Unterordner eines leeren Verzeichnisses wollte ich daher nicht ausgeben.

Das Problem ist nun: Ich habe mein Programm einmal auf einen meiner Ordner ausgeführt und da hat er einiges gelöscht, danach habe ich es nochmals ausgeführt und er hat wieder etwas gelöscht (diesmal nur einen Ordner, vorher viele). Das deutet ja auf einen Fehler hin. Leider habe ich die Ausgabe des ersten Durchlaufs nicht abgespeichert, aber der Fehler sollte ja durch den Code schon sichtbar werden.

Findet ihr den Fehler?


```
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class EmptyFolderSearch {

	private final List<File> emptyFolders;

	public EmptyFolderSearch(String path) {
		this(new File(path));
	}

	public EmptyFolderSearch(File dir) {
		emptyFolders = new ArrayList<File>();
		listEmptyFolders(dir);
		for (File emptyDir : emptyFolders) {
			System.out.println(emptyDir.getAbsolutePath());
		}
	}

	private void deleteThem() {
		for (File emptyDir : emptyFolders) {
			deleteFolder(emptyDir);
		}
	}

	private boolean deleteFolder(File dir) {
		if (dir.isDirectory()) {
			for (File file : dir.listFiles()) {
				deleteFolder(file);
			}
			return dir.delete();
		}
		return false;
	}

	private void listEmptyFolders(File dir) {
		if (isEmpty(dir)) {
			emptyFolders.add(dir);
		} else {
			for (File file : dir.listFiles()) {
				if (file.isDirectory()) {
					listEmptyFolders(file);
				}
			}
		}
	}

	private boolean isEmpty(File dir) {
		if (dir.isDirectory()) {
			for (File file : dir.listFiles()) {
				if (file.isDirectory()) {
					if (!isEmpty(file))
						return false;
				} else {
					return false;
				}
			}
			return true;
		}
		return false;
	}

	public static void main(String[] args) {
		EmptyFolderSearch search = new EmptyFolderSearch("...");
		search.deleteThem();
	}

}
```


----------



## André Uhres (21. Sep 2012)

Du solltest die Sache rekursiv angehen, hier findest Du Beispiele: http://www.java-forum.org/allgemeines/33129-verzeichnisse-durchsuchen-bearbeiten-auslesen.html

Gruß,
André


----------



## RungetSvohu (21. Sep 2012)

André Uhres hat gesagt.:


> Du solltest die Sache rekursiv angehen, hier findest Du Beispiele: http://www.java-forum.org/allgemeines/33129-verzeichnisse-durchsuchen-bearbeiten-auslesen.html
> 
> Gruß,
> André



Habe ich doch gemacht!


----------



## André Uhres (22. Sep 2012)

RungetSvohu hat gesagt.:


> Habe ich doch gemacht!



Ja, sorry, das war mir irgendwie entgangen. Ich schaue morgen noch mal nach. Heute habe ich leider keine Zeit wegen Barfußwanderung 

Gruß,
André


----------



## Kjubert (22. Sep 2012)

Könnte es daran liegen?

Angenommen Deine Ordnerstruktur sieht so aus:


```
Ordner A
-- Ordner B
-- -- Ordner C
-- -- Ordner D
-- Ordner E
-- -- Ordner F
-- Ordner G
```

So richtig leer sind hier ja nur C, D, F und G.
Wenn das Programm dann ausgeführt wird, sind auch B und E leere Ordner.
Und nach dem zweiten mal ist auch A leer.


----------



## André Uhres (24. Sep 2012)

Ich bin mir nicht ganz sicher, aber so was scheint mir zumindest suspekt zu sein: 
	
	
	
	





```
for (File file : dir.listFiles())
```
, weil das Array bei jedem Schleifendurchgang neu erstellt wird und auch die Reihenfolge im Array theoretisch ändern kann: _There is no guarantee that the name strings in the resulting array will appear in any specific order_. Die Seite, die ich oben angegeben habe, zeigt jedenfalls wie man es richtig macht .

Gruß,
André


----------



## Kjubert (24. Sep 2012)

André Uhres hat gesagt.:


> so was scheint mir zumindest suspekt zu sein:
> 
> 
> 
> ...



Richtig! Den Fehler hatte in einem anderen Kontext auch schon mal! ...sehr guter Punkt!

[EDIT]
Wobei ich mir bei dem neu-erstellen des Arrays nicht sicher bin, ob er das intern nicht korrekt umsetzt (mit temporärem Zwischen-Array oder so). Aber das mit der Reihenfolge schlägt ein und bringt alles durcheinander!
[/EDIT]


----------



## FArt (24. Sep 2012)

RungetSvohu hat gesagt.:


> Findet ihr den Fehler?



Warum schreibst du keine Unit-Tests und findest den Fehler selber?


----------



## André Uhres (24. Sep 2012)

Kjubert hat gesagt.:


> Wobei ich mir bei dem neu-erstellen des Arrays nicht sicher bin, ob er das intern nicht korrekt umsetzt (mit temporärem Zwischen-Array oder so).



Ja, Du hast recht, mein Compiler generiert zum Beispiel dies:


```
private void listEmptyFolders(File dir)
    {
        if(isEmpty(dir))
        {
            emptyFolders.add(dir);
        } else
        {
            File arr$[] = dir.listFiles();
            int len$ = arr$.length;
            for(int i$ = 0; i$ < len$; i$++)
            {
                File file = arr$[i$];
                if(file.isDirectory())
                {
                    listEmptyFolders(file);
                }
            }

        }
    }
```

Gruß,
André


----------



## RungetSvohu (25. Sep 2012)

```
Ordner A
-- Ordner B
-- -- Ordner C
-- -- Ordner D
-- Ordner E
-- -- Ordner F
-- Ordner G
```

Habe das mal probiert mit genau diesem Beispiel (siehe Anhang), aber da löscht er mir gleich alles weg. Also hier macht er es in einem Zug.

Edit: Huch, da kamen ja noch viele Beiträge hinzu, für mich war der von Kjubert (22.09.2012, 17:52 Uhr) der letzte, hatte den Thread schon lange in einem alten Tab offen.


----------



## Kjubert (25. Sep 2012)

RungetSvohu hat gesagt.:


> Habe das mal probiert mit genau diesem Beispiel (siehe Anhang), aber da löscht er mir gleich alles weg. Also hier macht er es in einem Zug.



Hm. Das ist ja wie es sein soll, denn die Ordner sind ja alle leer (also bis auf weitere leere Ordner).


----------



## André Uhres (26. Sep 2012)

RungetSvohu hat gesagt.:


> da löscht er mir gleich alles weg. Also hier macht er es in einem Zug.



Ja. soweit war ich auch schon und dann habe ich die Struktur schrittweise verändert um ein Fehlverhalten zu entdecken: bis jetzt kein Fehlverhalten!!

Gruß,
André


----------

