Java IO Tutorial

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.

  1. Files.walkFileTree + FileVisitor (Java 7)
  2. Files.walk (Java 8)
  3. FileUtils.deleteDirectory (Apache Common IO)
  4. 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.

Terminal

$ 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.

DirectoryDelete1.java

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

Terminal

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.

pom.xml

  <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

Terminal

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

References

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
15 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
bharath
10 years ago

it wont delete if sub-folder has sub-folder and subfiles

test
11 years ago
 
import java.io.File;

public class removerDir {
	
	public static void main(String args[])
	{
		File file = new File("C:\\Users\\486834\\Desktop\\df");
		recursiveDelete(file); 
	}
	public static void recursiveDelete(File file) {
		
        if (!file.exists())
            return;
        
        if (file.isDirectory()) {
            for (File f : file.listFiles()) {
                recursiveDelete(f);
            }
        }
        
        file.delete();
    }
}
Mansour
11 years ago

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

    FileUtils.deleteDirectory(f);

Best regards.

do
11 years ago

even simpler:

void recursiveDelete(File file) {
        if (!file.exists())
            return;
        if (file.isDirectory()) {
            for (File f : file.listFiles()) {
                recursiveDelete(f);
            }
        }
        file.delete();
    }
Pascal
3 years ago

Hi,

what is the most efficient solution in terms of speed of execution?

Regards

venkat
4 years ago

Directory is deleted : C:\mkyong-new
How to exclude this step?

komal shivhare
5 years ago

Helpful..Thank you so much…!!

Naeem
10 years ago

Thank you so much!

a
10 years ago

Thanks! Quick and easy

tisaik
11 years ago

Thank you a lot!
I use it on my project.

asdf
11 years ago

Awesome Simplified code above

da
11 years ago

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);
}

da
11 years ago
Reply to  da
 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);
 }