it-swarm.com.de

Löschen von nicht leeren in Java

Angenommen, ich habe einen File f, der ein Verzeichnis darstellt, dann löscht f.delete() das Verzeichnis nur, wenn es leer ist. Ich habe ein Paar von Beispielen online gefunden, die File.listFiles() oder File.list() verwenden, um alle Dateien im Verzeichnis abzurufen und dann die Verzeichnisstruktur rekursiv zu durchlaufen und alle Dateien zu löschen. Da es jedoch möglich ist, unendlich rekursive Verzeichnisstrukturen zu erstellen (sowohl unter Windows als auch unter Linux (mit symbolischen Links)), ist es wahrscheinlich, dass Programme, die in diesem Stil geschrieben wurden, niemals beendet werden.

Gibt es eine bessere Möglichkeit, ein solches Programm zu schreiben, damit es nicht in diese Fallstricke gerät? Muss ich den Überblick behalten, wo ich mich gerade befunden habe, und sicherstellen, dass ich mich nicht im Kreis bewege, oder gibt es einen schöneren Weg?

Update: Als Antwort auf einige der Antworten (danke Jungs!) - Wäre es besser, wenn der Code keinen symbolischen Links folgt und in dem Verzeichnis bleibt, das er löschen soll. Kann ich mich auf die Commons-IO-Implementierung verlassen, um dies auch im Windows-Fall zu tun?

28
Martin McNulty

Wenn Sie wirklich möchten, dass das Löschen eines rekursiven Verzeichnisses über symbolische Links erfolgt, gibt es meines Erachtens keine plattformunabhängige Möglichkeit, ohne alle Verzeichnisse zu verfolgen, die Sie durchlaufen haben.

Ich kann mir jedoch fast immer vorstellen, dass Sie nur den tatsächlichen symbolischen Link löschen möchten, der auf das Verzeichnis verweist, anstatt den symbolischen Link rekursiv zu durchlaufen.

Wenn dies das gewünschte Verhalten ist, können Sie die Methode FileUtils.deleteDirectory in Apache Commons IO verwenden.

32
Il-Bhima

Versuchen Sie Apache Commons IO für eine getestete Implementierung.

Ich glaube jedoch nicht, dass dies das Problem der unendlichen Rekursion löst.

7
Joshua Fox

File.getCanonicalPath () teilt Ihnen den „echten“ Namen der Datei mit, einschließlich aufgelöster Symlinks. Wenn Sie beim Scannen auf ein Verzeichnis stoßen, das Sie bereits kennen (weil Sie es in einer Map gespeichert haben), können Sie es retten.

3
Bombe

Wenn Sie wissen, welche Dateien Symlinks sind, können Sie diese einfach überspringen.

Es gibt leider keine "saubere" Möglichkeit, Symlinks in Java zu erkennen. Schauen Sie sich diese reine Java-Problemumgehung oder diese mit nativem Code an.

0
Morendil

Zumindest unter MacOSX wird durch das Löschen einer symbolischen Verknüpfung zu einem Verzeichnis das Verzeichnis selbst nicht gelöscht und kann daher auch dann gelöscht werden, wenn das Zielverzeichnis nicht leer ist.

Ich gehe davon aus, dass dies für die meisten POSIX-Betriebssysteme gilt. Und so weit ich weiß, sind Links unter Windows auch nur Dateien und können als solche aus einem Java-Programm gelöscht werden.

0