Angenommen, ich habe eine File f
, die ein Verzeichnis darstellt, dann löscht f.delete()
das Verzeichnis nur, wenn es leer ist. Ich habe einen couple von examples online gefunden, der File.listFiles()
oder File.list()
verwendet, um alle Dateien in dem Verzeichnis abzurufen, und rekursiv anschließend die Verzeichnisstruktur durchsucht und alle Dateien löscht. Da es jedoch möglich ist, unendlich rekursive Verzeichnisstrukturen zu erstellen (sowohl in Windows als auch in Linux (mit symbolischen Links)), ist es wahrscheinlich möglich, dass Programme, die in diesem Stil geschrieben sind, niemals enden.Löschen von nicht leeren Verzeichnissen in Java
Gibt es also einen besseren Weg, ein solches Programm zu schreiben, damit es nicht in diese Fallstricke gerät? Muss ich den Überblick behalten, wohin ich auch gefahren bin, und sicherstellen, dass ich nicht im Kreis herumlaufe oder gibt es einen schöneren Weg?
Update: Als Antwort auf einige der Antworten (Danke Jungs!) - Ich würde lieber den Code nicht folgen symbolische Links und blieb innerhalb des Verzeichnisses, das es löschen sollte. Kann ich das auf die Commons-IO-Implementierung anwenden, auch im Windows-Fall?
Ich hätte gedacht, dass eine rekursive Löschung ziemlich verlangsamen würde. Können Sie nicht eine File.getPath(). Equals (File.getCanonicalPath())? –
Ich bin mir nicht sicher, wie viele gazillions von rekursiven Verzeichnissen Sie verarbeiten möchten, aber ein Map.put() und ein Map.contains() pro Verzeichnis werden Sie nicht verlangsamen. Der von dir vorgeschlagene Code würde dir nur sagen, dass irgendwo auf deinem Pfad symbolische Links stehen. Sie befinden sich möglicherweise über dem Verzeichnis, das Sie löschen möchten. – Bombe
Ehrlich gesagt: Sorgen Sie sich darum, die Arbeit zuerst zu erledigen.Nur wenn es perfekt funktioniert und Sie können messen, dass es langsam ist (was auch immer das bedeutet), dann fangen Sie erst an, sich Gedanken über die Leistung zu machen. Vorzeitige Optimierung ist so hirnlos, dass es mir weh tut. Physisch. – Bombe