445 Stimmen

Verzeichnisse rekursiv löschen in Java

Gibt es eine Möglichkeit, in Java ganze Verzeichnisse rekursiv zu löschen?

Im Normalfall ist es möglich, ein leeres Verzeichnis zu löschen. Wenn es jedoch darum geht, ganze Verzeichnisse mit Inhalt zu löschen, ist das nicht mehr so einfach.

Wie kann man in Java ganze Verzeichnisse mit Inhalt löschen?

35voto

Paulitex Punkte 443

Ich habe gerade gesehen, dass meine Lösung mehr oder weniger die gleiche ist wie die von Erickson, nur als statische Methode verpackt. Lassen Sie diese irgendwo, es ist viel leichter Gewicht als die Installation aller Apache Commons für etwas, das (wie Sie sehen können) ist ziemlich einfach.

public class FileUtils {
    /**
     * By default File#delete fails for non-empty directories, it works like "rm". 
     * We need something a little more brutual - this does the equivalent of "rm -r"
     * @param path Root File Path
     * @return true iff the file and all sub files/directories have been removed
     * @throws FileNotFoundException
     */
    public static boolean deleteRecursive(File path) throws FileNotFoundException{
        if (!path.exists()) throw new FileNotFoundException(path.getAbsolutePath());
        boolean ret = true;
        if (path.isDirectory()){
            for (File f : path.listFiles()){
                ret = ret && deleteRecursive(f);
            }
        }
        return ret && path.delete();
    }
}

21voto

trianam Punkte 201

Eine Lösung mit einem Stapel und ohne rekursive Methoden:

File dir = new File("/path/to/dir");
File[] currList;
Stack<File> stack = new Stack<File>();
stack.push(dir);
while (! stack.isEmpty()) {
    if (stack.lastElement().isDirectory()) {
        currList = stack.lastElement().listFiles();
        if (currList.length > 0) {
            for (File curr: currList) {
                stack.push(curr);
            }
        } else {
            stack.pop().delete();
        }
    } else {
        stack.pop().delete();
    }
}

20voto

Ben Hutchison Punkte 4663

Wenn Sie Spring verwenden, können Sie FileSystemUtils.deleteRecursively :

import org.springframework.util.FileSystemUtils;

boolean success = FileSystemUtils.deleteRecursively(new File("directory"));

17voto

Andrew McKinlay Punkte 2391

Guave hatte Files.deleteRecursively(File) unterstützt bis Guave 9 .

En Guave 10 :

Veraltet. Diese Methode leidet unter der schlechten Erkennung von Symlinks und Race Conditions. Diese Funktionalität kann nur angemessen unterstützt werden, indem man einen Betriebssystembefehl wie rm -rf o del /s . Es ist geplant, diese Methode in Guava 11.0 aus Guava zu entfernen.

Daher gibt es keine solche Methode in Guave 11 .

12voto

user3669782 Punkte 767
for(Path p : Files.walk(directoryToDelete).
        sorted((a, b) -> b.compareTo(a)). // reverse; files before dirs
        toArray(Path[]::new))
{
    Files.delete(p);
}

Oder wenn Sie die IOException :

Files.walk(directoryToDelete).
    sorted((a, b) -> b.compareTo(a)). // reverse; files before dirs
    forEach(p -> {
        try { Files.delete(p); }
        catch(IOException e) { /* ... */ }
      });

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