Leere Verzeichnisse löschen

RungetSvohu

Bekanntes Mitglied
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?

Java:
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();
	}

}
 
Könnte es daran liegen?

Angenommen Deine Ordnerstruktur sieht so aus:

Code:
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.
 
Ich bin mir nicht ganz sicher, aber so was scheint mir zumindest suspekt zu sein:
Code:
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é
 
so was scheint mir zumindest suspekt zu sein:
Code:
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.

Gruß,
André

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]
 
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:

Java:
    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é
 
Code:
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.
 

Anhänge

  • A.zip
    A.zip
    870 Bytes · Aufrufe: 2
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben