Java удалить содержимое папки

Удаление директорий рекурсивно в Java

Проблема удаления файлов и директорий в Java может стать сложной для разработчика. В частности, особенно это касается удаления директорий с содержимым.

Проблема удаления файлов и директорий в Java может стать сложной для разработчика. В частности, особенно это касается удаления директорий с содержимым. В Java, при стандартном подходе, можно удалить только пустую директорию. Если директория содержит файлы или другие директории, то стандартные методы не смогут удалить ее.

Пример: представим, что есть директория с именем ‘Directory’, которая содержит файлы ‘File1.txt’, ‘File2.txt’ и директорию ‘SubDirectory’ с файлом ‘SubFile1.txt’. Если попытаться удалить ‘Directory’ стандартными методами, то операция не будет выполнена.

В Java есть несколько способов решения этой проблемы.

Использование рекурсии

Один из подходов — использовать рекурсивный метод. Сначала проверяется, является ли путь директорией. Если это так, то метод вызывается рекурсивно для всех файлов и поддиректорий. После этого удаляется сама директория.

public static void deleteDirectory(File directory) < File[] contents = directory.listFiles(); if (contents != null) < for (File file : contents) < deleteDirectory(file); >> directory.delete(); >

Использование библиотеки Apache Commons IO

Другой подход — использование сторонней библиотеки, которая предоставляет удобные методы для работы с файловой системой. Например, библиотека Apache Commons IO.

FileUtils.deleteDirectory(new File("/path/to/directory"));

В этом случае, весь указанный путь, включая все файлы и поддиректории, будет удален.

Читайте также:  User home page php

Использование Java NIO

Начиная с Java 7, можно использовать классы из пакета java.nio.file для рекурсивного удаления директорий.

public static void deleteDirectory(Path path) throws IOException < Files.walkFileTree(path, new SimpleFileVisitor<Path>() < @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 < Files.delete(dir); return FileVisitResult.CONTINUE; >>); >

Все эти подходы позволяют решить проблему удаления директорий с содержимым в Java. Выбор подхода зависит от конкретного случая и предпочтений разработчика.

Источник

How to delete a directory and its contents in Java

Many candidates are rejected or down-leveled due to poor performance in their System Design Interview. Stand out in System Design Interviews and get hired in 2023 with this popular free course.

In Java, we can loop through all the files and folders inside a directory and delete it. To delete a directory:

  • Use the Files.walk method to walk through all the files of the directory. This method returns a stream with Paths .
  • All the files are traversed in depth-first order. Reverse the stream and delete it from inner files.
  • Call Files.delete(path) to delete the file or directory.

Example

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;
public class Main
public static void main(String[] args) throws IOException
Path dir = Paths.get("path"); //path to the directory
Files
.walk(dir) // Traverse the file tree in depth-first order
.sorted(Comparator.reverseOrder())
.forEach(path ->
try
System.out.println("Deleting: " + path);
Files.delete(path); //delete each file or directory
> catch (IOException e)
e.printStackTrace();
>
>);
>
>

In the above code, we looped through all the files normal files and directory of the directory and deleted them. This also deletes the current directory.

Learn in-demand tech skills in half the time

Источник

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.

Источник

Как удалить содержимое каталога в Java?

После перечисления каталога мне теперь нужно удалить все файлы.

final File[] files = outputFolder.listFiles(); files.delete(); 

Но это не удалило каталог.

ОТВЕТЫ

Ответ 1

Вы должны сделать это для каждого файла:

public static void deleteFolder(File folder) < File[] files = folder.listFiles(); if(files!=null) < //some JVMs return null for empty dirs for(File f: files) < if(f.isDirectory()) < deleteFolder(f); >else < f.delete(); >> > folder.delete(); > 

Ответ 2

Чтобы удалить папку с файлами, нет необходимости в цикле или рекурсивном поиске. Вы можете напрямую использовать:

Эта функция будет удалять папку и все файлы в ней.

Ответ 3

Все файлы должны быть удалены из каталога до его удаления.

Существуют сторонние библиотеки, в которых есть много общих утилит, включая те, которые делают это для вас:

Ответ 4

Вы не можете удалить массив! Это должно работать лучше:

for (File f : files) f.delete(); 

Но это не сработает, если папки не пусты. Для этих случаев вам потребуется рекурсивно спуститься в иерархию папок и удалить все. Да, стыдно, что Java по умолчанию не может.

Ответ 5

Вы не можете удалить массив File . Как и все другие ответы, вы должны удалить каждый отдельный файл перед удалением папки.

final File[] files = outputFolder.listFiles(); for (File f: files) f.delete(); outputFolder.delete(); 

Ответ 6

Вот одно из возможных решений для решения проблемы без библиотеки:

public static boolean delete(File file) < File[] flist = null; if(file == null)< return false; >if (file.isFile()) < return file.delete(); >if (!file.isDirectory()) < return false; >flist = file.listFiles(); if (flist != null && flist.length > 0) < for (File f : flist) < if (!delete(f)) < return false; >> > return file.delete(); > 

Ответ 7

Использовать FileUtils с FileUtils.deleteDirectory();

Ответ 8

for(File f : files) < f.delete(); >files.delete(); // will work 

Источник

Как удалить содержимое каталога в Java?

После перечисления каталога мне теперь нужно удалить все файлы.

final File[] files = outputFolder.listFiles(); files.delete(); 

Но это не удалило каталог.

ОТВЕТЫ

Ответ 1

Вы должны сделать это для каждого файла:

public static void deleteFolder(File folder) < File[] files = folder.listFiles(); if(files!=null) < //some JVMs return null for empty dirs for(File f: files) < if(f.isDirectory()) < deleteFolder(f); >else < f.delete(); >> > folder.delete(); > 

Ответ 2

Чтобы удалить папку с файлами, нет необходимости в цикле или рекурсивном поиске. Вы можете напрямую использовать:

Эта функция будет удалять папку и все файлы в ней.

Ответ 3

Все файлы должны быть удалены из каталога до его удаления.

Существуют сторонние библиотеки, в которых есть много общих утилит, включая те, которые делают это для вас:

Ответ 4

Вы не можете удалить массив! Это должно работать лучше:

for (File f : files) f.delete(); 

Но это не сработает, если папки не пусты. Для этих случаев вам потребуется рекурсивно спуститься в иерархию папок и удалить все. Да, стыдно, что Java по умолчанию не может.

Ответ 5

Вы не можете удалить массив File . Как и все другие ответы, вы должны удалить каждый отдельный файл перед удалением папки.

final File[] files = outputFolder.listFiles(); for (File f: files) f.delete(); outputFolder.delete(); 

Ответ 6

Вот одно из возможных решений для решения проблемы без библиотеки:

public static boolean delete(File file) < File[] flist = null; if(file == null)< return false; >if (file.isFile()) < return file.delete(); >if (!file.isDirectory()) < return false; >flist = file.listFiles(); if (flist != null && flist.length > 0) < for (File f : flist) < if (!delete(f)) < return false; >> > return file.delete(); > 

Ответ 7

Использовать FileUtils с FileUtils.deleteDirectory();

Ответ 8

for(File f : files) < f.delete(); >files.delete(); // will work 

Источник

Оцените статью