35 Stimmen

Löschen von nicht leeren Verzeichnissen in Java

Angenommen, ich habe eine File f das ein Verzeichnis darstellt, dann f.delete() wird das Verzeichnis nur gelöscht, wenn es leer ist. Ich habe eine Paar von Beispiele online, die die File.listFiles() o File.list() um alle Dateien im Verzeichnis zu erhalten und durchläuft dann rekursiv die Verzeichnisstruktur und löscht alle Dateien. Da es jedoch möglich ist, unendlich viele rekursive Verzeichnisstrukturen zu erstellen (sowohl in Windows und Linux (mit symbolischen Links)) ist es vermutlich möglich, dass Programme, die in diesem Stil geschrieben wurden, niemals beendet werden.

Gibt es also einen besseren Weg, ein solches Programm zu schreiben, so dass es nicht in diese Fallen fällt? Muss ich alle Orte, die ich durchquert habe, im Auge behalten und sicherstellen, dass ich mich nicht im Kreis drehe, oder gibt es einen besseren Weg?

Aktualisierung: Als Antwort auf einige der Antworten (vielen Dank, Leute!) wäre es mir lieber, wenn der Code nicht den symbolischen Links folgen und innerhalb des Verzeichnisses bleiben würde, das er löschen soll. Kann ich mich auf die Commons-IO-Implementierung verlassen, um das zu tun, auch im Fall von Windows?

42voto

Il-Bhima Punkte 10556

Wenn Sie wirklich wollen, dass die rekursive Löschung von Verzeichnissen über symbolische Links erfolgt, dann gibt es meiner Meinung nach keine plattformunabhängige Möglichkeit, dies zu tun, ohne alle durchlaufenen Verzeichnisse zu verfolgen.

In so gut wie allen Fällen, die mir einfallen, würden Sie jedoch nur den tatsächlichen symbolischen Link löschen wollen, der auf das Verzeichnis verweist, anstatt den symbolischen Link rekursiv zu verfolgen.

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

9voto

Joshua Fox Punkte 16940

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

Ich glaube jedoch nicht, dass damit das Problem der unendlichen Rekursion gelöst wird.

3voto

Bombe Punkte 77831

[Datei.getCanonicalPath()](http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#getCanonicalPath()) gibt Ihnen den "echten" Namen der Datei an, einschließlich aufgelöster Symlinks. Wenn Sie beim Scannen auf ein Verzeichnis stoßen, das Sie bereits kennen (weil Sie es in einer Karte ) auszusteigen.

0voto

Morendil Punkte 3830

Wenn Sie wüssten, welche Dateien Symlinks sind, könnten Sie diese einfach übergehen.

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

0voto

Zumindest unter MacOSX löscht das Löschen eines symbolischen Links zu einem Verzeichnis nicht das Verzeichnis selbst und kann daher auch gelöscht werden, wenn das Zielverzeichnis nicht leer ist.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X