Methods given in Java for deleting a directory work only when the directory is empty, in case you want to recursively delete a directory then you need to write logic to walk through the whole folder structure (files and sub-folders) to delete all of them before deleting the parent directory. This article shows how can you delete a file or directory in Java and how to recursively delete a directory in Java.
- Methods in Java for deleting file or directory
- java.io.File delete() method example to delete file
- Files.delete() method example to delete file/directory
- Files.deleteIfExists() method example to delete file/directory
- Deleting directory recursively in Java
- Deleting directory recursively using File.listFiles() method
- Deleting directory recursively using Java Files.walkFileTree method
Methods in Java for deleting file or directory
- delete()- In java.io.File class there is a delete() method which deletes the file or directory denoted by this abstract pathname. If this pathname denotes a directory, then the directory must be empty in order to be deleted. Method retruns true if the file or directory is successfully deleted; false otherwise.
- Files.delete(Path path)- java.nio.file.Files.delete() method available Java 7 onward is another option for deleting a file in Java. If the file is a directory then the directory must be empty in order to be deleted. Throws NoSuchFileException if the file does not exist, throws DirectoryNotEmptyException if the file is a directory and could not otherwise be deleted because the directory is not empty.
- deleteIfExists(Path path)- java.nio.file.Files.deleteIfExists() method available Java 7 onward deletes a file if it exists. If the file is a directory then the directory must be empty. Throws DirectoryNotEmptyException if the file is a directory and could not otherwise be deleted because the directory is not empty.
java.io.File delete() method example to delete file
import java.io.File; public class DeleteFileExp { public static void main(String[] args) { File file = new File("F:\\Temp\\abc.txt"); deleteFile(file); // deleting file that doesn't exist scenario file = new File("F:\\Temp\\xyz.txt"); deleteFile(file); // Deleting empty directory scenario file = new File("F:\\NETJS\\EmptyDir"); deleteFile(file); // Deleting non-empty directory scenario file = new File("F:\\Temp"); deleteFile(file); } private static void deleteFile(File file){ if(file.delete()){ System.out.println("File " + file.getName() + " deleted"); }else{ System.out.println("File " + file.getName() + " not deleted, reason file doesn't exist or non-empty directory"); } } }
Output
File abc.txt deleted File xyz.txt not deleted, reason file doesn't exist or non-empty directory File EmptyDir deleted File Temp not deleted, reason file doesn't exist or non-empty directory
Files.delete() method example to delete file/directory
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public class DeleteFileExp { public static void main(String[] args) throws IOException { // deleting file Files.delete(Paths.get("F:\\Temp\\abc.txt")); // Deleting empty directory scenario Files.delete(Paths.get("F:\\NETJS\\EmptyDir")); } }
When the file doesn’t exist or non-empty directory deletion scenario with Files.delete() method.
public class DeleteFileExp { public static void main(String[] args) throws IOException { // deleting file Files.delete(Paths.get("F:\\Temp\\abc.txt")); //Deleting empty directory scenario //Files.delete(Paths.get("F:\\Temp")); } }
Output
Exception in thread "main" java.nio.file.NoSuchFileException: F:\Temp\abc.txt at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108) at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:274) at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105) at java.base/java.nio.file.Files.delete(Files.java:1144) at org.netjs.prog.DeleteFileExp.main(DeleteFileExp.java:11)
public class DeleteFileExp { public static void main(String[] args) throws IOException { // deleting file // Files.delete(Paths.get("F:\\Temp\\abc.txt")); // Deleting empty directory scenario Files.delete(Paths.get("F:\\Temp")); } }
Output
Exception in thread "main" java.nio.file.DirectoryNotEmptyException: F:\Temp at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:271) at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105) at java.base/java.nio.file.Files.delete(Files.java:1144) at org.netjs.prog.DeleteFileExp.main(DeleteFileExp.java:14)
Files.deleteIfExists() method example to delete file/directory
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public class DeleteFileExp { public static void main(String[] args) throws IOException { // deleting file if(Files.deleteIfExists(Paths.get("F:\\Temp\\abc.txt"))) { System.out.println("File deleted successfully"); }else { System.out.println("File not deleted"); } // Deleting empty directory scenario Files.deleteIfExists(Paths.get("F:\\Temp")); } }
Output
File deleted successfully Exception in thread "main" java.nio.file.DirectoryNotEmptyException: F:\Temp at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:271) at java.base/sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:110) at java.base/java.nio.file.Files.deleteIfExists(Files.java:1183) at org.netjs.prog.DeleteFileExp.main(DeleteFileExp.java:18)
As you can see exception is thrown when there is an attempt to delete a non-empty directory.
Deleting directory recursively in Java
In all the above examples trying to delete a non-empty directory results in an exception being thrown. In case of non-empty directory you need to walk through the directory structure and delete all the files and sub-directories with in the parent directory and then delete the parent directory.
For traversing the folder structure in Java there are two options-
- File.listFiles()
- Files.walkFileTree java 7 onward
Deleting directory recursively using File.listFiles() method
listFiles() method of the File class returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname. You need to loop the array and recursively traverse files for the sub-directories to delete those files first and then the directories reaching up to the parent directory.
Directory structure used in the example.
Test \Temp \Child sub.txt \Empty Folder abc.txt bus.txt PDF in web.png
import java.io.File; import java.io.IOException; public class DeleteFileExp { public static void main(String[] args) throws IOException { // Source folder final String PARENT_DIR = "G:\\Test"; File sourceDir = new File(PARENT_DIR); listFiles(sourceDir); } private static void listFiles(File parentDir){ if(!parentDir.isDirectory()){ System.out.println("Not a directory."); return; } File[] fileList = parentDir.listFiles(); // iterate array for(File file : fileList){ // if it's a directory list files with in sub-directory for deletion if(file.isDirectory()){ System.out.println("Directory- " + file.getName()); listFiles(file); }else{ System.out.println("Deleting File- " + file.getName()); // if it is a file then delete it file.delete(); } } // For deleting directories System.out.println("Deleting Directory - " + parentDir.getName()); parentDir.delete(); } }
Output
Deleting File- bus.txt Deleting File- PDF in web.png Directory- Temp Deleting File- abc.txt Directory- Child Deleting File- sub.txt Deleting Directory - Child Directory- Empty Folder Deleting Directory - Empty Folder Deleting Directory - Temp Deleting Directory – Test
Deleting directory recursively using Java Files.walkFileTree method
Using walkFileTree(Path start, FileVisitor<? super Path> visitor) method you can walk a file tree.
You need to implement FileVisitor interface, implementation of two of the methods of FileVisitor is required-
postVisitDirectory- To delete directory once it is empty
visitFile- to delete files when visited.
import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; public class DeleteFileExp { public static void main(String[] args) throws IOException { // Source folder final String PARENT_DIR = "G:\\Test"; WalkStructure(PARENT_DIR); } private static void WalkStructure(String parentDir) throws IOException { Path sourcePath = Paths.get(parentDir); Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>(){ @Override // After directory is visited and files deleted delete empty directory public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException { System.out.println("Deleting Directory- " + dir.toString()); Files.delete(dir); return FileVisitResult.CONTINUE; } @Override // Delete each visited file public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException{ System.out.println("Deleting file- " + file.getFileName()); Files.delete(file); return FileVisitResult.CONTINUE; } }); } }
Output
Deleting file- bus.txt Deleting file- PDF in web.png Deleting file- abc.txt Deleting file- sub.txt Deleting Directory- G:\Test\Temp\Child Deleting Directory- G:\Test\Temp\Empty Folder Deleting Directory- G:\Test\Temp Deleting Directory- G:\Test
That's all for this topic Java Program to Delete File And Directory Recursively. If you have any doubt or any suggestions to make please drop a comment. Thanks!
>>>Return to Java Programs Page
Related Topics
You may also like-