How to delete directory in Java
If we use the NIO Files.delete
to delete a non-empty directory in Java, it throws DirectoryNotEmptyException
; for legacy IO File.delete
to delete a non-empty directory, it returns a false. The standard solution is to loop the directory recursively, and delete all its children’s contents first (sub-files or sub-directories), and delete the parent later.
This example shows some common ways to delete a directory in Java.
Files.walkFileTree
+FileVisitor
(Java 7)Files.walk
(Java 8)FileUtils.deleteDirectory
(Apache Common IO)- Recursive delete in a directory (Plain Java code)
Directory Structure.
We use Files
to create directories and files for testing.
public static void createDummyFiles() throws IOException {
Files.createDirectories(Paths.get("/home/mkyong/test2/test3/test4/test5/"));
Files.write(Paths.get("/home/mkyong/test2/test2.log"), "hello".getBytes());
Files.write(Paths.get("/home/mkyong/test2/test3/test3.log"), "hello".getBytes());
}
Review the directory structure.
$ tree test2
test2
├── test2.log
└── test3
├── test3.log
└── test4
└── test5
Later we will delete the test2
directory, including all its contents (sub-directories or sub-files)
1. Delete Directory – Files.walkFileTree (Java 7)
This example uses the NIO Files.walkFileTree
+ SimpleFileVisitor
to delete a directory. The FileVisitor
will visit all the sub-directories and sub-files for a specified path.
package com.mkyong.io.directory;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class DirectoryDelete1 {
public static void createDummyFiles() throws IOException {
Files.createDirectories(Paths.get("/home/mkyong/test2/test3/test4/test5/"));
Files.write(Paths.get("/home/mkyong/test2/test2.log"), "hello".getBytes());
Files.write(Paths.get("/home/mkyong/test2/test3/test3.log"), "hello".getBytes());
}
public static void main(String[] args) {
String dir = "/home/mkyong/test2/";
try {
createDummyFiles();
deleteDirectoryJava7(dir);
System.out.println("Done");
} catch (IOException e) {
System.err.printf("Failed to delete the directory %n%s%n", e);
}
}
public static void deleteDirectoryJava7(String filePath)
throws IOException {
Path path = Paths.get(filePath);
Files.walkFileTree(path,
new SimpleFileVisitor<>() {
// delete directories or folders
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc)
throws IOException {
Files.delete(dir);
System.out.printf("Directory is deleted : %s%n", dir);
return FileVisitResult.CONTINUE;
}
// delete files
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs)
throws IOException {
Files.delete(file);
System.out.printf("File is deleted : %s%n", file);
return FileVisitResult.CONTINUE;
}
}
);
}
}
Output
File is deleted : /home/mkyong/test2/test2.log
Directory is deleted : /home/mkyong/test2/test3/test4/test5
Directory is deleted : /home/mkyong/test2/test3/test4
File is deleted : /home/mkyong/test2/test3/test3.log
Directory is deleted : /home/mkyong/test2/test3
Directory is deleted : /home/mkyong/test2
Done
2. Delete Directory – Files.walk (Java 8)
This example uses Files.walk
to return a Stream<Path>
for the directory, and the Stream<Path>
contains all sub-directories and sub-files for the specified path.
public static void deleteDirectoryJava8(String dir) throws IOException {
Path path = Paths.get(dir);
// read java doc, Files.walk need close the resources.
// try-with-resources to ensure that the stream's open directories are closed
try (Stream<Path> walk = Files.walk(path)) {
walk
.sorted(Comparator.reverseOrder())
.forEach(DirectoryDelete::deleteDirectoryJava8Extract);
}
}
// extract method to handle exception in lambda
public static void deleteDirectoryJava8Extract(Path path) {
try {
Files.delete(path);
} catch (IOException e) {
System.err.printf("Unable to delete this path : %s%n%s", path, e);
}
}
3. Delete Directory – FileUtils (Common IO)
This example uses the Apache Common IO FileUtils.deleteDirectory
to delete a directory.
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
import org.apache.commons.io.FileUtils;
FileUtils.deleteDirectory(new File(dir));
4. Delete Directory – Plain Java Code
This example uses the legacy IO java.io.*
and a simple recursive loop algorithm to delete a directory.
public static void deleteDirectoryLegacyIO(File file) {
File[] list = file.listFiles();
if (list != null) {
for (File temp : list) {
//recursive delete
System.out.println("Visit " + temp);
deleteDirectoryLegacyIO(temp);
}
}
if (file.delete()) {
System.out.printf("Delete : %s%n", file);
} else {
System.err.printf("Unable to delete file or directory : %s%n", file);
}
}
Output
Visit /home/mkyong/test2/test2.log
Delete : /home/mkyong/test2/test2.log
Visit /home/mkyong/test2/test3
Visit /home/mkyong/test2/test3/test4
Visit /home/mkyong/test2/test3/test4/test5
Delete : /home/mkyong/test2/test3/test4/test5
Delete : /home/mkyong/test2/test3/test4
Visit /home/mkyong/test2/test3/test3.log
Delete : /home/mkyong/test2/test3/test3.log
Delete : /home/mkyong/test2/test3
Delete : /home/mkyong/test2
Done
Download Source Code
$ git clone https://github.com/mkyong/core-java
$ cd java-io
it wont delete if sub-folder has sub-folder and subfiles
We updated the article with more examples. It will delete a directory and including its sub-directories and sub-files.
Hi,
More Simple is to use FileUtils of Apache Commons (org.apache.commons.io.FileUtils):
deleteDirectory
public static void deleteDirectory(File directory)
throws IOException
Deletes a directory recursively.
Parameters:
directory – directory to delete
Throws:
IOException – in case deletion is unsuccessful
Best regards.
even simpler:
Hi,
what is the most efficient solution in terms of speed of execution?
Regards
Directory is deleted : C:\mkyong-new
How to exclude this step?
Comment the line?
Helpful..Thank you so much…!!
Thank you so much!
Thanks! Quick and easy
Thank you a lot!
I use it on my project.
Awesome Simplified code above
more simple:
private static void recursiveDelete(File file) {
if (!file.exists()) return;
if (file.isDirectory()) {
for (File f : file.listFiles()) recursiveDelete(f);
file.delete();
} else {
file.delete();
}
}
public static void deleteDir(String dirname) {
File directory = new File(dirname);
recursiveDelete(directory);
}