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

15 comments on “How to delete directory in Java

  1. Hi,

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

    Regards

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

    Reply
  3. it wont delete if sub-folder has sub-folder and subfiles

    Reply
    1. We updated the article with more examples. It will delete a directory and including its sub-directories and sub-files.

      Reply
  4. 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.

    Reply
  5.  
    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();
        }
    }
    
    Reply
  6. even simpler:

    void recursiveDelete(File file) {
            if (!file.exists())
                return;
            if (file.isDirectory()) {
                for (File f : file.listFiles()) {
                    recursiveDelete(f);
                }
            }
            file.delete();
        }
    
    Reply
  7. 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);
    }

    Reply
    1.  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);
       }
      
      Reply

Leave a Comment

Your email address will not be published. Required fields are marked *