Как удалить директорию с файлами java
Можно удалить файлы, каталоги или ссылки. С символьными ссылками ссылка удаляется а не цель ссылки. С каталогами каталог должен быть пустым, или сбои удаления.
Files class обеспечивает два метода удаления.
delete(Path) метод удаляет файл или выдает исключение, если удаление перестало работать. Например, если файл не существует a NoSuchFileException бросается. Можно поймать исключение, чтобы определить почему удаление отказавшего следующим образом:
try < Files.delete(path); >catch (NoSuchFileException x) < System.err.format("%s: no such" + " file or directory%n", path); >catch (DirectoryNotEmptyException x) < System.err.format("%s not empty%n", path); >catch (IOException x) < // File permission problems are caught here. System.err.println(x); >
deleteIfExists(Path) метод также удаляет файл, но если файл не существует, никакое исключение не выдается. Сбой тихо полезен, когда у Вас есть многократные потоки, удаляя файлы, и Вы не хотите выдавать исключение только, потому что один поток сделал столь сначала.
Ваше использование этой страницы и всего материала на страницах под «Учебным баннером» Java подвергается этим официальным уведомлениям.
Авторское право © 1995, 2012 Oracle и/или его филиалы. Все права защищены.
Удалить файл и директорию в которой он находился
Подскажите пожалуйста как можно удалить директорию уже после удаления файла который в ней лежал. Сам файл удаляю в конце кода, но нужно и дропнуть саму папку в которой он был. Вот пример моего кода:
response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("application/application/octet-stream"); String filePath = "D:/file/ПЛ5.111.008 СБ/ПЛ5.111.008 СБ [1].tif"; String test = request.getParameter("test"); simpleDLL sdll = simpleDLL.INSTANCE; File file = new File(filePath); String getFileName = file.getName(); getFileName = getFileName.replace(" ", ""); String URLEncodedFileName = URLEncoder.encode(getFileName, "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + URLEncodedFileName); FileInputStream fileIn = new FileInputStream(file); ServletOutputStream out = response.getOutputStream(); byte[] outputByte = new byte[4096];//copy binary contect to output stream while (fileIn.read(outputByte, 0, 4096) != -1) < out.write(outputByte, 0, 4096); >fileIn.close(); out.flush(); out.close(); request.setAttribute("test", test); RequestDispatcher view = request.getRequestDispatcher("/index.jsp"); file.delete();
Как удалить все папки (с выложенными в них файлами) и файлы из папки?
Контекст следующий: есть одна папка. В ней лежат несколько файлов, а также несколько папок в которых в свою очередь лежит несколько файлов.
Как мне полностью очистить данную папку?
На данный момент попрообовал реализовать через такой код:
recursiveDelete(new File("C:/ProgramData/Ex")); public static void recursiveDelete(File file) throws NullPointerException < if (!file.exists()) return; if (file.isDirectory()) < for (File f : file.listFiles()) < recursiveDelete(f); >> file.delete(); System.out.println("Удаленный файл или папка: " + file.getAbsolutePath()); >
Но он удаляет только некоторые файлы, а про файлы в папках не добирается? Как можно модифицировать данный код, чтобы он очищал папку?
- Вопрос задан более трёх лет назад
- 391 просмотр
Удалить каталог рекурсивно в Java
В этой статье мы покажем, как рекурсивно удалить каталог в простой Java. Мы также рассмотрим некоторые альтернативы для удаления каталогов с помощью внешних библиотек.
2. Рекурсивное удаление каталога
В Java есть возможность удалить каталог. Однако для этого требуется, чтобы каталог был пуст. Итак, нам нужно использовать рекурсию для удаления определенного непустого каталога:
- Получить все содержимое каталога для удаления
- Удалить все дочерние элементы, не являющиеся каталогом (выход из рекурсии)
- Для каждого подкаталога текущего каталога начните с шага 1 (рекурсивный шаг)
- Удалить каталог
Давайте реализуем этот простой алгоритм:
boolean deleteDirectory(File directoryToBeDeleted) File[] allContents = directoryToBeDeleted.listFiles(); if (allContents != null) for (File file : allContents) deleteDirectory(file); > > return directoryToBeDeleted.delete(); >
Этот метод можно протестировать с помощью простого тестового примера:
@Test public void givenDirectory_whenDeletedWithRecursion_thenIsGone() throws IOException Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME); boolean result = deleteDirectory(pathToBeDeleted.toFile()); assertTrue(result); assertFalse( "Directory still exists", Files.exists(pathToBeDeleted)); >
Метод @Before нашего тестового класса создает дерево каталогов с подкаталогами и файлами в расположении pathToBeDeleted, а метод @After при необходимости очищает каталог.
Далее давайте посмотрим, как мы можем добиться удаления, используя две наиболее часто используемые библиотеки — Apache commons-io и spring-core Spring Framework. Обе эти библиотеки позволяют нам удалять каталоги, используя всего одну строку кода.
3. Использование FileUtils из commons-io
Во- первых, нам нужно добавить зависимость commons-io в проект Maven:
dependency> groupId>commons-iogroupId> artifactId>commons-ioartifactId> version>2.11.0version> dependency>
Последнюю версию зависимости можно найти здесь .
Теперь мы можем использовать FileUtils для выполнения любых операций с файлами, включая deleteDirectory() , всего одним оператором:
FileUtils.deleteDirectory(file);
4. Использование FileSystemUtils из Spring
В качестве альтернативы мы можем добавить зависимость s pring-core к проекту Maven:
dependency> groupId>org.springframeworkgroupId> artifactId>spring-coreartifactId> version>4.3.10.RELEASEversion> dependency>
Последнюю версию зависимости можно найти здесь.
Мы можем использовать метод deleteRecursively() в FileSystemUtils для выполнения удаления:
boolean result = FileSystemUtils.deleteRecursively(file);
Последние выпуски Java предлагают новые способы выполнения таких операций ввода-вывода, описанные в следующих разделах.
5. Использование NIO2 с Java 7
В Java 7 представлен совершенно новый способ выполнения операций с файлами с помощью Files . Это позволяет нам перемещаться по дереву каталогов и использовать обратные вызовы для выполнения действий.
public void whenDeletedWithNIO2WalkFileTree_thenIsGone() throws IOException Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME); Files.walkFileTree(pathToBeDeleted, new SimpleFileVisitorPath>() @Override public FileVisitResult postVisitDirectory( Path dir, IOException exc) throws IOException Files.delete(dir); return FileVisitResult.CONTINUE; > @Override public FileVisitResult visitFile( Path file, BasicFileAttributes attrs) throws IOException Files.delete(file); return FileVisitResult.CONTINUE; > >); assertFalse("Directory still exists", Files.exists(pathToBeDeleted)); >
Метод Files.walkFileTree() проходит по дереву файлов и генерирует события. Нам нужно указать обратные вызовы для этих событий. Итак, в этом случае мы определим SimpleFileVisitor для выполнения следующих действий для сгенерированных событий:
- Посещение файла – удалить его
- Посещение каталога перед обработкой его записей — ничего не делать
- Посещение каталога после обработки его записей — удалите каталог, так как все записи в этом каталоге уже были обработаны (или удалены)
- Не удалось посетить файл — повторно сгенерируйте исключение IOException , вызвавшее сбой.
Пожалуйста, обратитесь к Введение в файловый API Java NIO2 для получения более подробной информации об API NIO2 для обработки файловых операций.
6. Использование NIO2 с Java 8
Начиная с Java 8, Stream API предлагает еще лучший способ удаления каталога:
@Test public void whenDeletedWithFilesWalk_thenIsGone() throws IOException Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME); Files.walk(pathToBeDeleted) .sorted(Comparator.reverseOrder()) .map(Path::toFile) .forEach(File::delete); assertFalse("Directory still exists", Files.exists(pathToBeDeleted)); >
Здесь Files.walk() возвращает поток пути , который мы сортируем в обратном порядке . Это помещает пути, обозначающие содержимое каталогов, перед самими каталогами. После этого он сопоставляет путь к файлу и удаляет каждый файл.
7. Заключение
В этом кратком руководстве мы рассмотрели различные способы удаления каталога. Пока мы видели, как использовать рекурсию для удаления, мы также рассмотрели некоторые библиотеки, NIO2, использующие события, и Java 8 Path Stream, использующий парадигму функционального программирования.
Весь исходный код и тестовые примеры для этой статьи доступны на GitHub .
- 1. Введение
- 2. Рекурсивное удаление каталога
- 3. Использование FileUtils из commons-io
- 4. Использование FileSystemUtils из Spring
- 5. Использование NIO2 с Java 7
- 6. Использование NIO2 с Java 8
- 7. Заключение