Как удалить папку с файлами с помощью 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){
File currentFile = new File(index.getPath(),s);
currentFile.delete();
}
Тогда вы сможете удалить папку, используя 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);
С этого сайта: http://www.baeldung.com/java-delete-directory
В 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(<your_directory_path_to_delete>);
FileSystemUtils.deleteRecursively(directoryToDelete);
Это сработает!
Это лучшее решение для Java 7+
:
public static void deleteDirectory(String directoryFilePath) throws IOException
{
Path directory = Paths.get(directoryFilePath);
if (Files.exists(directory))
{
Files.walkFileTree(directory, new SimpleFileVisitor<Path>()
{
@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;
}
});
}
}
Моя базовая рекурсивная версия, работающая со старыми версиями JDK:
public static void deleteFile(File element) {
if (element.isDirectory()) {
for (File sub : element.listFiles()) {
deleteFile(sub);
}
}
element.delete();
}
Гуава 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<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 {
if (exc != null) {
throw exc;
}
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
2020 здесь:)
В Apache commons io FileUtils, в отличие от "чистых" вариантов Java, папка не обязательно должна быть пустой для удаления. Чтобы дать вам лучший обзор, я перечисляю здесь варианты, следующие 3 могут вызывать исключения по разным причинам:
- cleanDirectory: очищает каталог, не удаляя его
- forceDelete: удаляет файл. Если файл является каталогом, удалите его и все подкаталоги.
- forceDeleteOnExit: планирует удаление файла при выходе из JVM. Если файл является каталогом, удалите его и все подкаталоги. Не рекомендуется для запуска серверов, поскольку JVM может не выйти в ближайшее время...
Следующий вариант никогда не вызывает исключений (даже если файл нулевой!)
- deleteQuietly: удаляет файл, не вызываяисключения. Если файл является каталогом, удалите его и все подкаталоги.
Еще одна вещь, которую следует знать, касается символических ссылок, они удаляют символическую ссылку, а не целевую папку... будьте осторожны.
Также имейте в виду, что удаление большого файла или папки может быть блокирующей операцией на некоторое время... поэтому, если вы не возражаете, чтобы он запускался асинхронно, сделайте это (например, в фоновом потоке через исполнителя).
Вы можете использовать FileUtils.deleteDirectory. JAVA не может удалить непустые фолды с помощью File.delete ().
Если у вас есть подпапки, вы найдете проблемы с ответами Cemron. поэтому вы должны создать метод, который работает следующим образом:
private void deleteTempFile(File tempFile) {
try
{
if(tempFile.isDirectory()){
File[] entries = tempFile.listFiles();
for(File currentFile: entries){
deleteTempFile(currentFile);
}
tempFile.delete();
}else{
tempFile.delete();
}
getLogger().info("DELETED Temporal File: " + tempFile.getPath());
}
catch(Throwable t)
{
getLogger().error("Could not DELETE file: " + tempFile.getPath(), t);
}
}
В этом
index.delete();
if (!index.exists())
{
index.mkdir();
}
ты звонишь
if (!index.exists())
{
index.mkdir();
}
после
index.delete();
Это означает, что вы создаете файл снова после удаления File.delete() возвращает логическое значение. Так что, если вы хотите проверить, затем выполните System.out.println(index.delete());
если вы получите true
тогда это означает, что файл удален
File index = new File("/home/Work/Indexer1");
if (!index.exists())
{
index.mkdir();
}
else{
System.out.println(index.delete());//If you get true then file is deleted
if (!index.exists())
{
index.mkdir();// here you are creating again after deleting the file
}
}
из комментариев, приведенных ниже, обновленный ответ выглядит следующим образом
File f=new File("full_path");//full path like c:/home/ri
if(f.exists())
{
f.delete();
}
else
{
try {
//f.createNewFile();//this will create a file
f.mkdir();//this create a folder
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Вы можете сделать рекурсивный вызов, если существуют подкаталоги
import java.io.File;
class DeleteDir {
public static void main(String args[]) {
deleteDirectory(new File(args[0]));
}
static public boolean deleteDirectory(File path) {
if( path.exists() ) {
File[] files = path.listFiles();
for(int i=0; i<files.length; i++) {
if(files[i].isDirectory()) {
deleteDirectory(files[i]);
}
else {
files[i].delete();
}
}
}
return( path.delete() );
}
}
Мы можем использовать spring-core
зависимость;
boolean result = FileSystemUtils.deleteRecursively(file);
Большинство ответов (даже недавних), ссылающихся на классы JDK, основаны на File.delete()
но это некорректный API, так как операция может завершиться сбоем.
java.io.File.delete()
Документация метода гласит:
Обратите внимание, что
java.nio.file.Files
класс определяетdelete
метод броситьIOException
когда файл не может быть удален. Это полезно для отчетов об ошибках и для диагностики, почему файл не может быть удален.
В качестве замены вам следует отдать предпочтение Files.delete(Path p)
это бросает IOException
с сообщением об ошибке.
Фактический код может быть написан так:
Path index = Paths.get("/home/Work/Indexer1");
if (!Files.exists(index)) {
index = Files.createDirectories(index);
} else {
Files.walk(index)
.sorted(Comparator.reverseOrder()) // as the file tree is traversed depth-first and that deleted dirs have to be empty
.forEach(t -> {
try {
Files.delete(t);
} catch (IOException e) {
// LOG the exception and potentially stop the processing
}
});
if (!Files.exists(index)) {
index = Files.createDirectories(index);
}
}
Вот простой способ сделать это:
public void deleteDirectory(String directoryPath) {
new Thread(new Runnable() {
public void run() {
for(String e: new File(directoryPath).list()) {
if(new File(e).isDirectory())
deleteDirectory(e);
else
new File(e).delete();
}
}
}).start();
}
You can simply remove the directory which contains a single file or multiple files using the apache commons library.
градиентный импорт:
группа реализации: «commons-io», имя: «commons-io», версия: «2.5»
File file=new File("/Users/devil/Documents/DummyProject/hello.txt");
File parentDirLocation=new File(file.getParent);
//Confirming the file parent is a directory or not.
if(parentDirLocation.isDirectory){
//after this line the mentioned directory will deleted.
FileUtils.deleteDirectory(parentDirLocation);
}
directry не может просто удалить, если у него есть файлы, поэтому вам может понадобиться сначала удалить файлы внутри, а затем каталог
public class DeleteFileFolder {
public DeleteFileFolder(String path) {
File file = new File(path);
if(file.exists())
{
do{
delete(file);
}while(file.exists());
}else
{
System.out.println("File or Folder not found : "+path);
}
}
private void delete(File file)
{
if(file.isDirectory())
{
String fileList[] = file.list();
if(fileList.length == 0)
{
System.out.println("Deleting Directory : "+file.getPath());
file.delete();
}else
{
int size = fileList.length;
for(int i = 0 ; i < size ; i++)
{
String fileName = fileList[i];
System.out.println("File path : "+file.getPath()+" and name :"+fileName);
String fullPath = file.getPath()+"/"+fileName;
File fileOrFolder = new File(fullPath);
System.out.println("Full Path :"+fileOrFolder.getPath());
delete(fileOrFolder);
}
}
}else
{
System.out.println("Deleting file : "+file.getPath());
file.delete();
}
}
Вы можете попробовать следующим образом
File dir = new File("path");
if (dir.isDirectory())
{
dir.delete();
}
Если в вашей папке есть подпапки, вам может потребоваться их рекурсивное удаление.
private void deleteFileOrFolder(File file){
try {
for (File f : file.listFiles()) {
f.delete();
deleteFileOrFolder(f);
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
import org.apache.commons.io.FileUtils;
List<String> directory = new ArrayList();
directory.add("test-output");
directory.add("Reports/executions");
directory.add("Reports/index.html");
directory.add("Reports/report.properties");
for(int count = 0 ; count < directory.size() ; count ++)
{
String destination = directory.get(count);
deleteDirectory(destination);
}
public void deleteDirectory(String path) {
File file = new File(path);
if(file.isDirectory()){
System.out.println("Deleting Directory :" + path);
try {
FileUtils.deleteDirectory(new File(path)); //deletes the whole folder
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
System.out.println("Deleting File :" + path);
//it is a simple file. Proceed for deletion
file.delete();
}
}
Работает как Шарм. Для папки и файлов. Салам:)
Вы также можете использовать это для удаления папки, содержащей подпапки и файлы.
Кулак, создайте рекурсивную функцию.
private void recursiveDelete(File file){ if(file.list().length > 0){ String[] list = file.list(); for(String is: list){ File currentFile = new File(file.getPath(),is); if(currentFile.isDirectory()){ recursiveDelete(currentFile); }else{ currentFile.delete(); } } }else { file.delete(); } }
затем из исходной функции используйте цикл while для вызова рекурсии.
private boolean deleteFolderContainingSubFoldersAndFiles(){ boolean deleted = false; File folderToDelete = new File("C:/mainFolderDirectoryHere"); while(folderToDelete != null && folderToDelete.isDirectory()){ recursiveDelete(folderToDelete); } return deleted; }
List<File> temp = Arrays.asList(new File("./DIRECTORY").listFiles());
for (int i = 0; i < temp.size(); i++)
{
temp.get(i).delete();
}
Удалить его из другой части
File index = new File("/home/Work/Indexer1");
if (!index.exists())
{
index.mkdir();
System.out.println("Dir Not present. Creating new one!");
}
index.delete();
System.out.println("File deleted successfully");
import java.io.File;
public class Main{
public static void main(String[] args) throws Exception {
deleteDir(new File("c:\\temp"));
}
public static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir (new File(dir, children[i]));
if (!success) {
return false;
}
}
}
return dir.delete();
System.out.println("The directory is deleted.");
}
}