Удалить каталоги рекурсивно в Java - PullRequest
357 голосов
/ 23 апреля 2009

Есть ли способ рекурсивного удаления целых каталогов в Java?

В обычном случае можно удалить пустой каталог. Однако, когда дело доходит до удаления целых каталогов с содержимым, это уже не так просто.

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

Ответы [ 23 ]

10 голосов
/ 29 июня 2011
public void deleteRecursive(File path){
    File[] c = path.listFiles();
    System.out.println("Cleaning out folder:" + path.toString());
    for (File file : c){
        if (file.isDirectory()){
            System.out.println("Deleting file:" + file.toString());
            deleteRecursive(file);
            file.delete();
        } else {
            file.delete();
        }
    }
    path.delete();
}
7 голосов
/ 26 декабря 2011
static public void deleteDirectory(File path) 
{
    if (path == null)
        return;
    if (path.exists())
    {
        for(File f : path.listFiles())
        {
            if(f.isDirectory()) 
            {
                deleteDirectory(f);
                f.delete();
            }
            else
            {
                f.delete();
            }
        }
        path.delete();
    }
}
4 голосов
/ 13 мая 2011

Два способа потерпеть неудачу с символическими ссылками и приведенным выше кодом ... и не знаю решения.

Путь № 1

Запустите это, чтобы создать тест:

echo test > testfile
mkdir dirtodelete
ln -s badlink dirtodelete/badlinktodelete

Здесь вы видите свой тестовый файл и тестовый каталог:

$ ls testfile dirtodelete
testfile

dirtodelete:
linktodelete

Затем запустите ваш commons-io deleteDirectory (). Вылетает, говоря, что файл не найден. Не уверен, что другие примеры делают здесь. Команда Linux rm просто удалит ссылку, а также rm -r в каталоге.

Exception in thread "main" java.io.FileNotFoundException: File does not exist: /tmp/dirtodelete/linktodelete

Путь № 2

Запустите это, чтобы создать тест:

mkdir testdir
echo test > testdir/testfile
mkdir dirtodelete
ln -s ../testdir dirtodelete/dirlinktodelete

Здесь вы видите свой тестовый файл и тестовый каталог:

$ ls dirtodelete testdir
dirtodelete:
dirlinktodelete

testdir:
testfile

Затем запустите ваш commons-io deleteDirectory () или пример кода, который разместили люди. Он удаляет не только каталог, но и ваш тестовый файл, который находится за пределами удаляемого каталога. (Он неявно разыменовывает каталог и удаляет содержимое). rm -r удалит только ссылку. Вам нужно использовать что-то вроде этого, чтобы удалить разыменованные файлы: "find -L dirtodelete -type f -exec rm {} \;".

$ ls dirtodelete testdir
ls: cannot access dirtodelete: No such file or directory
testdir:
4 голосов
/ 25 декабря 2017

Оптимальное решение, которое обрабатывает исключение в соответствии с подходом, согласно которому исключение, выброшенное из метода, всегда должно описывать то, что этот метод пытался (и не смог) сделать:

private void deleteRecursive(File f) throws Exception {
    try {
        if (f.isDirectory()) {
            for (File c : f.listFiles()) {
                deleteRecursive(c);
            }
        }
        if (!f.delete()) {
            throw new Exception("Delete command returned false for file: " + f);
        }
    } 
    catch (Exception e) {
        throw new Exception("Failed to delete the folder: " + f, e);
    }
}
3 голосов
/ 11 февраля 2013

Вы можете использовать:

org.apache.commons.io.FileUtils.deleteQuietly(destFile);

Удаляет файл, никогда не создавая исключение. Если файл является каталогом, удалите его и все подкаталоги. Разница между File.delete () и этим методом: Каталог, который нужно удалить, не должен быть пустым. Нет исключений, если файл или каталог не может быть удален.

3 голосов
/ 16 мая 2016

В устаревших проектах мне нужно создать собственный Java-код. Я создаю этот код, похожий на код Paulitex. Смотрите, что:

public class FileHelper {

   public static boolean delete(File fileOrFolder) {
      boolean result = true;
      if(fileOrFolder.isDirectory()) {
         for (File file : fileOrFolder.listFiles()) {
            result = result && delete(file);
         }
      }
      result = result && fileOrFolder.delete();
      return result;
   } 
}

И юнит-тест:

public class FileHelperTest {

    @Before
    public void setup() throws IOException {
       new File("FOLDER_TO_DELETE/SUBFOLDER").mkdirs();
       new File("FOLDER_TO_DELETE/SUBFOLDER_TWO").mkdirs();
       new File("FOLDER_TO_DELETE/SUBFOLDER_TWO/TEST_FILE.txt").createNewFile();
    }

    @Test
    public void deleteFolderWithFiles() {
       File folderToDelete = new File("FOLDER_TO_DELETE");
       Assert.assertTrue(FileHelper.delete(folderToDelete));
       Assert.assertFalse(new File("FOLDER_TO_DELETE").exists());
    }

}
2 голосов
/ 10 марта 2018

Код ниже рекурсивно удаляет все содержимое в данной папке.

boolean deleteDirectory(File directoryToBeDeleted) {
    File[] allContents = directoryToBeDeleted.listFiles();
    if (allContents != null) {
        for (File file : allContents) {
            deleteDirectory(file);
        }
    }
    return directoryToBeDeleted.delete();
}
1 голос
/ 24 апреля 2009

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

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class DeleteFiles {

/**
 * @param intitial arguments take in a source to read from and a 
 * destination to read to
 */
    public static void main(String[] args)
                     throws FileNotFoundException,IOException {
        File src = new File(args[0]);
        if (!src.exists() ) {
            System.out.println("FAILURE!");
        }else{
            // Gathers files in directory
            File[] a = src.listFiles();
            for (int i = 0; i < a.length; i++) {
                //Sends files to recursive deletion method
                fileDelete(a[i]);
            }
            // Deletes original source folder
            src.delete();
            System.out.println("Success!");
        }
    }

    /**
     * @param srcFile Source file to examine
     * @throws FileNotFoundException if File not found
     * @throws IOException if File not found
     */
    private static void fileDelete(File srcFile)
                     throws FileNotFoundException, IOException {
        // Checks if file is a directory
        if (srcFile.isDirectory()) {
            //Gathers files in directory
            File[] b = srcFile.listFiles();
            for (int i = 0; i < b.length; i++) {
                //Recursively deletes all files and sub-directories
                fileDelete(b[i]);
            }
            // Deletes original sub-directory file
            srcFile.delete();
        } else {
            srcFile.delete();
        }
    }
}

Надеюсь, это поможет!

1 голос
/ 18 сентября 2015

без общего ввода-вывода и

public static void deleteRecursive(File path){
            path.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    if (pathname.isDirectory()) {
                        pathname.listFiles(this);
                        pathname.delete();
                    } else {
                        pathname.delete();
                    }
                    return false;
                }
            });
            path.delete();
        }
0 голосов
/ 20 декабря 2017

Хорошо, давайте возьмем пример,

import java.io.File;
import java.io.IOException;

public class DeleteDirectory
{
   private static final String folder = "D:/project/java";

   public static void main(String[] args) throws IOException
   {
      File fl = new File(folder);
      if(!fl.exists()) // checking if directory exists
      {
         System.out.println("Sorry!! directory doesn't exist.");
      }
      else
      {
         DeleteDirectory dd = new DeleteDirectory();
         dd.deleteDirectory(fl);
      }
   }

   public void deleteDirectory(File file) throws IOException
   {
      if(file.isDirectory())
      {
         if(file.list().length == 0)
         { 
            deleteEmptyDirectory(file); // here if directory is empty delete we are deleting
         }
         else
         {
            File fe[] = file.listFiles();
            for(File deleteFile : fe)
            {
               deleteDirectory(deleteFile); // recursive call
            }
            if(file.list().length == 0)
            {
               deleteEmptyDirectory(file);
            }
         }
      }
      else
      {
         file.delete();
         System.out.println("File deleted : " + file.getAbsolutePath());
      }
   }

   private void deleteEmptyDirectory(File fi)
   {
      fi.delete();
      System.out.println("Directory deleted : " + fi.getAbsolutePath());
   }
}

Для получения дополнительной информации обратитесь к ресурсам ниже

Удалить каталог

...