Java File delete()

xybit

Lieutenant
Registriert
Okt. 2004
Beiträge
517
Hallo zusammen,

ich sitze grad an einem merkwürdigen Problem. Folgender Code:

public void cleanTemp() {
File f = new File("tempdir/");
delChilds(f);

}

private void delChilds(File f) {
for (int i = 0; i < f.list().length; i++) {
if (f.listFiles().isDirectory() == true) {
delChilds(f.listFiles());
} else {
System.out.println(f.listFiles().getAbsolutePath());
System.out.println(f.listFiles().isFile());
System.out.printf( "readable=%s, writable=%s%n", f.canRead(), f.canWrite() );
System.out.println(f.listFiles().delete());
}
}

}

2 Methoden die rekursiv durch ein Verzeichnis gehen und es löschen sollen. Alle printouts liefern true für alle Files. Die Pfade werden ebenfalls richtig ausgegeben. Lese und Schreib rechte sind ebenfalls true, doch die Files und Verzeichnisse werden nicht gelöscht. Bin ebenfalls noch mal durch den gesamten code und hab überprüft, dass alles Reader und Streams geschlossen sind. Kein Erfolg.

Weiss jemand von euch weiter? Kann es an windows 7 liegen?

Beste Grüsse und Danke
 
Bist du 100% sicher, dass alle Outputstreams geschlossen sind? Probiere nach dem Schließen mal System.gc() aufzurufen (http://stackoverflow.com/questions/991489/i-cant-delete-a-file-in-java).

Abgesehen davon wird dein Code nicht alle Dateien löschen: Du rufst immer erneut f.listFiles() auf und greifst dann mit einem festen Index auf einen Eintrag zu. Das ist 1. nicht performant und 2. verkleinert sich die Liste durch das Löschen (normalerweise) aber du zählst deinen Index weiter hoch und überspringst so Dateien.
 
das aufrufen von System.gc() brachte keine Verbesserung. Und ja, ich bin mir sicher, dass alle geschlossen sind, ist nur ein Stream der aufgemacht und dann geschlossen wird :-)

Wie würdest du es implementieren?


EDIT: Jetzt verstehe ich, was ihr meint, aber löscht delete nicht auch den index aus der list? sprich i-- müsste das problem beheben, oder?
 
Zuletzt bearbeitet:
Code:
private void delChilds(final File f) {
        final File[] files = f.listFiles();

        for( final File file : files ) {
            if( file.isDirectory() == true ) {
                delChilds( file );
                file.delete();
            } else {
                System.out.println( file.getAbsolutePath() );
                System.out.println( file.isFile() );
                System.out.printf( "readable=%s, writable=%s%n", f.canRead(), f.canWrite() );
                System.out.println( file.delete() );
            }
        }
    }
 
xybit schrieb:
EDIT: Jetzt verstehe ich, was ihr meint, aber löscht delete nicht auch den index aus der list? sprich i-- müsste das problem beheben, oder?
Nein, warum sollte es? Du rufst delete() ja auf ein Objekt in der Liste auf und nicht auf die Liste selbst. Und mit i-- kannst du u.U. in eine Endlosschleife geraten. Nimm die Lösung von Soultaker.
(Aber das "file.isDirectory() == true" musst du nicht 1:1 übernehmen. ;)
 
Zurück
Oben