- Как удалить папку с файлами с помощью Java
- 33 ответа
- Delete folder with all files java
- Standard recursion (Java 6 and before)
- Standard recursion using NIO (since Java 7)
- Walk tree (since Java 7)
- Streams and NIO2 (since Java 8)
- Apache Commons IO
- Conclusion
- How to delete folder and sub folders using Java?
- Example
- Output
- Using ApacheCommonsIO
- Maven dependency
- Example
Как удалить папку с файлами с помощью Java
Я хочу создать и удалить каталог, используя Java, но он не работает.
File index = new File("/home/Work/Indexer1"); if (!index.exists()) < index.mkdir(); >else < index.delete(); if (!index.exists()) < index.mkdir(); >>
33 ответа
Java не может удалять папки с данными в нем. Вы должны удалить все файлы перед удалением папки.
String[]entries = index.list(); for(String s: entries)
Тогда вы сможете удалить папку, используя index.delete() Непроверенные!
import org.apache.commons.io.FileUtils; FileUtils.deleteDirectory(new File(destination));
Это работает, и хотя пропустить проверку каталога выглядит неэффективно, это не так: проверка происходит сразу же в listFiles() ,
void deleteDir(File file) < File[] contents = file.listFiles(); if (contents != null) < for (File f : contents) < deleteDir(f); >> file.delete(); >
Обновление, чтобы избежать следующих символических ссылок:
void deleteDir(File file) < File[] contents = file.listFiles(); if (contents != null) < for (File f : contents) < if (! Files.isSymbolicLink(f.toPath())) < deleteDir(f); >> > file.delete(); >
Я предпочитаю это решение на Java 8:
Files.walk(pathToBeDeleted) .sorted(Comparator.reverseOrder()) .map(Path::toFile) .forEach(File::delete);
В JDK 7 вы можете использовать Files.walkFileTree() а также Files.deleteIfExists() удалить дерево файлов.
В JDK 6 одним из возможных способов является использование FileUtils.deleteQuietly из Apache Commons, который удалит файл, каталог или каталог с файлами и подкаталогами.
Используя Apache Commons-IO, он выглядит следующим образом:
import org.apache.commons.io.FileUtils; FileUtils.forceDelete(new File(destination));
Это (немного) более производительно, чем FileUtils.deleteDirectory ,
Как уже упоминалось, Java не может удалить папку, содержащую файлы, поэтому сначала удалите файлы, а затем папку.
import org.apache.commons.io.FileUtils; // First, remove files from into the folder FileUtils.cleanDirectory(folder/path); // Then, remove the folder FileUtils.deleteDirectory(folder/path);
FileUtils.forceDelete(new File(destination));
Еще один вариант — использовать Spring org.springframework.util.FileSystemUtils соответствующий метод, который рекурсивно удалит все содержимое каталога.
File directoryToDelete = new File(); FileSystemUtils.deleteRecursively(directoryToDelete);
Моя базовая рекурсивная версия, работающая со старыми версиями JDK:
public static void deleteFile(File element) < if (element.isDirectory()) < for (File sub : element.listFiles()) < deleteFile(sub); >> element.delete(); >
Это лучшее решение для Java 7+ :
public static void deleteDirectory(String directoryFilePath) throws IOException < Path directory = Paths.get(directoryFilePath); if (Files.exists(directory)) < Files.walkFileTree(directory, new SimpleFileVisitor() < @Override public FileVisitResult visitFile(Path path, BasicFileAttributes basicFileAttributes) throws IOException < Files.delete(path); return FileVisitResult.CONTINUE; >@Override public FileVisitResult postVisitDirectory(Path directory, IOException ioException) throws IOException < Files.delete(directory); return FileVisitResult.CONTINUE; >>); > >
Гуава 21+ на помощь. Используйте только если нет ссылок, указывающих на каталог для удаления.
com.google.common.io.MoreFiles.deleteRecursively( file.toPath(), RecursiveDeleteOption.ALLOW_INSECURE ) ;
(Этот вопрос хорошо индексируется Google, поэтому другие люди, использующие Guava, могут быть рады найти этот ответ, даже если он излишний с другими ответами в другом месте.)
Вы можете попробовать это
public static void deleteDir(File dirFile) < if (dirFile.isDirectory()) < File[] dirs = dirFile.listFiles(); for (File dir: dirs) < deleteDir(dir); >> dirFile.delete(); >
Мне нравится это решение больше всего. Он не использует стороннюю библиотеку, вместо этого он использует NIO2 из Java 7.
/** * Deletes Folder with all of its content * * @param folder path to folder which should be deleted */ public static void deleteFolderAndItsContent(final Path folder) throws IOException < Files.walkFileTree(folder, new SimpleFileVisitor() < @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException < Files.delete(file); return FileVisitResult.CONTINUE; >@Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException < if (exc != null) < throw exc; >Files.delete(dir); return FileVisitResult.CONTINUE; > >); >
В Apache commons io FileUtils, в отличие от «чистых» вариантов Java, папка не обязательно должна быть пустой для удаления. Чтобы дать вам лучший обзор, я перечисляю здесь варианты, следующие 3 могут вызывать исключения по разным причинам:
- cleanDirectory: очищает каталог, не удаляя его
- forceDelete: удаляет файл. Если файл является каталогом, удалите его и все подкаталоги.
- forceDeleteOnExit: планирует удаление файла при выходе из JVM. Если файл является каталогом, удалите его и все подкаталоги. Не рекомендуется для запуска серверов, поскольку JVM может не выйти в ближайшее время.
Следующий вариант никогда не вызывает исключений (даже если файл нулевой!)
- deleteQuietly: удаляет файл, невызываяисключения. Если файл является каталогом, удалите его и все подкаталоги.
Еще одна вещь, которую следует знать, касается символических ссылок, они удаляют символическую ссылку, а не целевую папку. будьте осторожны.
Также имейте в виду, что удаление большого файла или папки может быть блокирующей операцией на некоторое время. поэтому, если вы не возражаете, чтобы он запускался асинхронно, сделайте это (например, в фоновом потоке через исполнителя).
Delete folder with all files java
Removing empty directory in Java is as simple as calling File.delete() (standard IO) or Files.delete() (NIO) method. However, if the folder is not empty (for example contains one or more files or subdirectories), these methods will refuse to remove it. In this post I want to present few ways to recursively remove the directory together with its contents.
Standard recursion (Java 6 and before)
The first method recursively removes files and directories from the directory tree starting from the leaves. Because it uses old I/O class File for operating on files and directories, this method can be used in any Java version.
void deleteDirectoryRecursionJava6(File file) throws IOException < if (file.isDirectory()) < File[] entries = file.listFiles(); if (entries != null) < for (File entry : entries) < deleteDirectoryRecursionJava6(entry); >> > if (!file.delete()) < throw new IOException("Failed to delete " + file); >>
Standard recursion using NIO (since Java 7)
Java 7 introduced improved API for I/O operations (also known as NIO). Once we decide to use it, the first method can be changed as follows:
void deleteDirectoryRecursion(Path path) throws IOException < if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) < try (DirectoryStreamentries = Files.newDirectoryStream(path)) < for (Path entry : entries) < deleteDirectoryRecursion(entry); >> > Files.delete(path); >
Walk tree (since Java 7)
Additionally, Java 7 introduced new method Files.walkFileTree() which traverses directory tree in the file-system using visitor design pattern. This new method can be easily used to recursively delete directory:
void deleteDirectoryWalkTree(Path path) throws IOException < FileVisitor visitor = new SimpleFileVisitor() < @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException < Files.delete(file); return FileVisitResult.CONTINUE; >@Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException < Files.delete(file); return FileVisitResult.CONTINUE; >@Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException < if (exc != null) < throw exc; >Files.delete(dir); return FileVisitResult.CONTINUE; > >; Files.walkFileTree(path, visitor); >
Streams and NIO2 (since Java 8)
Since Java 8 we can use Files.walk() method which behaves like this according to the official documentation:
Return a Stream that is lazily populated with Path by walking the file tree rooted at a given starting file. The file tree is traversed depth-first, the elements in the stream are Path objects that are obtained as if by resolving the relative path against start.
The stream has to be sorted in reverse order first to prevent removal of non-empty directory. The final code looks like this:
void deleteDirectoryStream(Path path) throws IOException
However, this code has two drawbacks:
- The stream is being sorted so all stream elements must be present in memory at the same time. This may significantly increase memory consumption for deep directory trees.
- There is no error handling because the return value from File.delete() is ignored. This can be improved by using custom lambda inside forEach().
Apache Commons IO
Finally, there is a one-liner solution for the impatient. Just add Maven dependency:
and call this single method:
FileUtils.deleteDirectory(file);
Conclusion
All of above methods should do the job. Personally, I prefer the last one because it is the simplest to use. The source code is available at GitHub.
How to delete folder and sub folders using Java?
The class named File of the java.io package represents a file or directory (path names) in the system. This class provides various methods to perform various operations on files/directories.
The delete() method of the File class deletes the file/directory represented by the current File object.
This ListFiles() method of the File class returns an array holding the objects (abstract paths) of all the files (and directories) in the path represented by the current (File) object.
Therefore, to delete a folder along with its sub directories and files, you need to define a recursive method.
Example
Following Java program deletes the specified directory recursively −
import java.io.File; public class DeletingFilesRecursively < static void deleteFolder(File file)< for (File subFile : file.listFiles()) < if(subFile.isDirectory()) < deleteFolder(subFile); >else < subFile.delete(); >> file.delete(); > public static void main(String args[]) < String filePath = "E://ExampleDirectory//"; //Creating the File object File file = new File(filePath); deleteFolder(file); System.out.println("Files deleted. "); >>
Output
Using ApacheCommonsIO
The deleteDirectory() method of the ApacheCommonsIO accepts a file path and directory deletes it recursively.
Maven dependency
Example
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; public class DeletingFilesRecursively2 < public static void main(String args[]) throws IOException < String filePath = "E://ExampleDirectory//"; //Creating the File object File file = new File(filePath); FileUtils.deleteDirectory(file); System.out.println("Files deleted. "); >>