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?

11voto

AdamOutler Punkte 837
public void deleteRecursive(File path){
    File[] c = path.listFiles();
    System.out.println("Cleaning out folder:" + path.toString());
    for (File file : c){
        if (file.isDirectory()){
            System.out.println("Deleting file:" + file.toString());
            deleteRecursive(file);
            file.delete();
        } else {
            file.delete();
        }
    }
    path.delete();
}

9voto

vladicho Punkte 91
public static void deleteDirectory(File path) 
{
    if (path == null)
        return;
    if (path.exists())
    {
        for(File f : path.listFiles())
        {
            if(f.isDirectory()) 
            {
                deleteDirectory(f);
                f.delete();
            }
            else
            {
                f.delete();
            }
        }
        path.delete();
    }
}

5voto

Peter Punkte 51

Zwei Möglichkeiten, mit Symlinks und dem obigen Code zu scheitern... und ich kenne die Lösung nicht.

Weg #1

Führen Sie dies aus, um einen Test zu erstellen:

echo test > testfile
mkdir dirtodelete
ln -s badlink dirtodelete/badlinktodelete

Hier sehen Sie Ihre Testdatei und Ihr Testverzeichnis:

$ ls testfile dirtodelete
testfile

dirtodelete:
linktodelete

Führen Sie dann Ihr commons-io deleteDirectory() aus. Es stürzt ab und meldet, dass die Datei nicht gefunden wurde. Ich bin mir nicht sicher, was die anderen Beispiele hier tun. Der Linux-Befehl rm würde einfach den Link löschen, und rm -r für das Verzeichnis würde das auch tun.

Exception in thread "main" java.io.FileNotFoundException: File does not exist: /tmp/dirtodelete/linktodelete

Weg #2

Führen Sie dies aus, um einen Test zu erstellen:

mkdir testdir
echo test > testdir/testfile
mkdir dirtodelete
ln -s ../testdir dirtodelete/dirlinktodelete

Hier sehen Sie Ihre Testdatei und Ihr Testverzeichnis:

$ ls dirtodelete testdir
dirtodelete:
dirlinktodelete

testdir:
testfile

Führen Sie dann Ihr commons-io deleteDirectory() oder den Beispielcode aus, den andere gepostet haben. Es löscht nicht nur das Verzeichnis, sondern auch Ihre Testdatei, die sich außerhalb des zu löschenden Verzeichnisses befindet. (Es dereferenziert das Verzeichnis implizit und löscht den Inhalt). rm -r würde nur den Link löschen. Sie müssen etwas wie dieses verwenden, um die dereferenzierten Dateien zu löschen: "find -L dirtodelete -type f -exec rm {} \;".

$ ls dirtodelete testdir
ls: cannot access dirtodelete: No such file or directory
testdir:

4voto

AgilePro Punkte 5192

Eine optimale Lösung, die Ausnahmen konsequent mit dem Ansatz behandelt, dass eine von einer Methode ausgelöste Ausnahme immer beschreiben sollte, was diese Methode zu tun versuchte (und scheiterte):

private void deleteRecursive(File f) throws Exception {
    try {
        if (f.isDirectory()) {
            for (File c : f.listFiles()) {
                deleteRecursive(c);
            }
        }
        if (!f.delete()) {
            throw new Exception("Delete command returned false for file: " + f);
        }
    } 
    catch (Exception e) {
        throw new Exception("Failed to delete the folder: " + f, e);
    }
}

4voto

Jan-Terje Sørensen Punkte 14018

Sie können es verwenden:

org.apache.commons.io.FileUtils.deleteQuietly(destFile);

Löscht eine Datei, ohne eine Ausnahme auszulösen. Wenn die Datei ein Verzeichnis ist, werden es und alle Unterverzeichnisse gelöscht. Der Unterschied zwischen File.delete() und dieser Methode sind: Ein zu löschendes Verzeichnis muss nicht leer sein. Es werden keine Ausnahmen ausgelöst, wenn eine Datei oder ein Verzeichnis nicht gelöscht werden kann.

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