Java methode um rekursiv leere ordner zu löschen

koffi

Lt. Junior Grade
Registriert
Jan. 2007
Beiträge
490
hallo!
wollte mal ne methode schreiben um leere ordner in einem verzeichnis zu löschen und ggf das verzeichnis selbst zu löschen, falls darin alle ordner gelöscht wurden (rekursiv).
aus irgend einem grund stürzt beim aufruf der methode aber die app ab und ich zerbreche mir schon lange den kopf darüber, was ich falsch gemacht habe.

kann mir jemand nen tip geben?

Code:
public class DeleteEmptyFolders {

	public static boolean go(File folder) {

		if (folder.exists()) {

			if (folder.list().length == 0) {
				folder.delete();
			}

			else {
				for (int i = 0; i < folder.list().length; i++) {
					if (folder.list()[i] != null) { //nur im fall dass es sich um einen ordner handelt
						 File subfolder = new File(folder, folder.list()[i]);
						 go(subfolder);
					}
				}
			}
			if (folder.list().length == 0) {
				folder.delete();
			}
		}

		return true;
	}

}
 
07-31 10:21:41.693: E/AndroidRuntime(4678): FATAL EXCEPTION: main
07-31 10:21:41.693: E/AndroidRuntime(4678): java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx.xxx.MainActivity}: java.lang.NullPointerException
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.ActivityThread.access$700(ActivityThread.java:140)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.os.Looper.loop(Looper.java:137)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.ActivityThread.main(ActivityThread.java:4921)
07-31 10:21:41.693: E/AndroidRuntime(4678): at java.lang.reflect.Method.invokeNative(Native Method)
07-31 10:21:41.693: E/AndroidRuntime(4678): at java.lang.reflect.Method.invoke(Method.java:511)
07-31 10:21:41.693: E/AndroidRuntime(4678): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
07-31 10:21:41.693: E/AndroidRuntime(4678): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
07-31 10:21:41.693: E/AndroidRuntime(4678): at dalvik.system.NativeStart.main(Native Method)
07-31 10:21:41.693: E/AndroidRuntime(4678): Caused by: java.lang.NullPointerException
07-31 10:21:41.693: E/AndroidRuntime(4678): at de.xxx.DeleteEmptyFolders.go(DeleteEmptyFolders.java:14)
07-31 10:21:41.693: E/AndroidRuntime(4678): at de.xxx.DeleteEmptyFolders.go(DeleteEmptyFolders.java:22)
07-31 10:21:41.693: E/AndroidRuntime(4678): at de.xxx.DeleteEmptyFolders.go(DeleteEmptyFolders.java:22)
07-31 10:21:41.693: E/AndroidRuntime(4678): at de.xxx.DeleteEmptyFolders.go(DeleteEmptyFolders.java:22)
07-31 10:21:41.693: E/AndroidRuntime(4678): at de.xxx.MainActivity.onCreate(MainActivity.java:24)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.Activity.performCreate(Activity.java:5206)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
07-31 10:21:41.693: E/AndroidRuntime(4678): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
07-31 10:21:41.693: E/AndroidRuntime(4678): ... 11 more
 
http://docs.oracle.com/javase/6/docs/api/ schrieb:
If this abstract pathname does not denote a directory, then this method returns null.
Du rufst list auf einer Datei auf und nicht auf einem Ordner. Du musst vorher erst prüfen, ob es sich um einen Ordner handelt.

Übrigens, was machst du mit Ordnern, die nur leere Unterordner enthalten? Schlauer wäre es eine Liste aller Ordner in Breadth-First Reihenfolge zu erstellen und vom Ende der Liste aus zu löschen, falls der Ordner leer ist.

PS: Also dafür braucht man nicht mal eine Fehlermeldung ;)
 
riDDi schrieb:
Übrigens, was machst du mit Ordnern, die nur leere Unterordner enthalten?

er löscht dann erst die leeren unterordner, und dann die ordner die diese enthielten.. oder? ^^
auf jeden fall vielen dank für deine hilfe! hab es hinbekommen.

Code:
public class DeleteEmptyFolders {

	public static boolean go(File folder) {

		if (folder.exists()) {
			if (folder.isDirectory()) {

					for (int i = 0; i < folder.list().length; i++) {
						if (folder.isDirectory()) {
							File subfolder = new File(folder, folder.list()[i]);
							go(subfolder);							 

						}
					}
			//	}
				if (folder.list().length == 0) {
					folder.delete();
					Log.e("cleaning up",
							"a folder was found empty and is deleted: "
									+ folder.getName());
				}
			}
		}

		return true;
	}

}
 
Zuletzt bearbeitet:
Zurück
Oben