Как удалить каталог с java-файлами

Обновлено: 06.07.2024

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

Удаление файла методом удаления java.io.File

  1. Файл, существующий по указанному пути, удаляется.
  2. Попытка удалить несуществующий файл.
  3. Удаление пустого каталога.
  4. Попытка удалить непустой каталог.

Вывод

Удаление файла с помощью метода Files delete и deleteIfExists

Метод Files.delete для удаления файла

Вывод

Метод Files.deleteIfExists для удаления файла

Вывод

Метод Files.delete для удаления папки в Java

Вывод

Рекурсивное удаление непустого каталога в Java

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

  1. Использование метода File.listFiles(), который возвращает массив абстрактных имен путей, обозначающих файлы в каталоге. Затем вы можете выполнить итерацию массива для удаления файлов, и вам придется рекурсивно вызывать свой метод для удаления файлов в подкаталогах.
  2. В Java 7 и более поздних версиях вы можете использовать метод Files.walkFileTree, который просматривает дерево файлов с корнем в заданном начальном файле.

Используемая структура каталогов

Показанные здесь Java-программы для удаления непустого каталога в Java используют следующую структуру каталогов.

удалить каталог с помощью Java

В родительской папке есть две подпапки: Дочерняя с двумя файлами и Пустая без файла. Один файл хранится в родительской папке.

Рекурсивное удаление каталога с помощью метода File.listFiles()

Вывод

Рекурсивное удаление каталога с помощью метода Java Files.walkFileTree

Java 7 и более поздних версий. Вы можете использовать метод Files.walkFileTree(), с помощью которого вы можете просмотреть древовидную структуру исходного каталога и удалить все файлы и подкаталоги в процессе. Одним из аргументов этого метода является интерфейс FileVisitor. Вам необходимо предоставить реализацию этого интерфейса в соответствии с вашими требованиями.

Интерфейс FileVisitor имеет четыре метода, для рекурсивного удаления каталога вам необходимо реализовать два из них; postVisitDirectory (для удаления каталога после посещения всех файлов) и visitFile (для удаления файлов).

Вывод

Похожие сообщения

Это все, что касается темы Удаление файла или каталога с помощью программы Java. Если чего-то не хватает или вам есть чем поделиться по теме, напишите комментарий.

Удалить пустой каталог в Java легко, просто используйте метод delete() класса java.io.File, но удалить каталог с файлами, к сожалению, непросто. Вы просто не можете удалить папку, если она содержит файлы или подпапки. Вызов метода delete() для экземпляра File, представляющего непустой каталог, просто вернет false без удаления каталога. Чтобы удалить эту папку, вам необходимо удалить все файлы и подкаталоги внутри этой папки. Это может показаться громоздким, но, к сожалению, нет метода, который может удалить каталог с файлами в Java, даже в классе Java 7 Files and Paths.

Итак, есть два варианта: либо вы напишите свой собственный метод для рекурсивного удаления всех файлов и папок перед удалением каталога, либо, в качестве альтернативы, вы можете использовать утилиту с открытым исходным кодом. библиотека, такая как Apache Commons IO, которая сделает это за вас.

Кстати, если вам нужно сделать это без использования какой-либо сторонней библиотеки, вы можете использовать пример, показанный в этом руководстве. Знаете что, я пару раз задавал этот вопрос Java-разработчикам, и только 3 из 10 знают, что в Java нельзя удалить каталог с файлами.

Я не удивлен, потому что это неочевидная деталь. Пока ты этого не сделаешь, ты этого не узнаешь. Java не может удалять папки с данными. Вы должны удалить все файлы перед удалением папки, как показано в первом примере этого руководства. Java 7 стала намного лучше с поддержкой файлов и каталогов, но, к сожалению, нет прямого метода для удаления каталога с файлами. Однако в JDK 7 вы могли использовать Files.walkFileTree() и Files.deleteIfExists() для удаления дерева файлов.

Программа Java для удаления непустого каталога в Java

Основным методом удаления файла или каталога в Java был метод File.delete() из java.ио пакет. Этот метод можно использовать для удаления файла или непустого каталога, но он не работает, когда дело доходит до удаления папки с файлами. Если вы проигнорируете возвращаемое значение этого метода, которое является ложным, если ему не удалось удалить каталог, вы никогда не узнаете, не удалось ли вашей программе удалить какой-либо каталог, и я видел многих разработчиков, пораженных этой пулей. К счастью, JDK 7 добавил еще один метод delete() в служебный класс Files для удаления файла и каталога, который выдает IOException, когда файл не может быть удален. Это действительно полезно для устранения неполадок, например. чтобы узнать, почему файл не может быть удален. Есть еще один похожий метод, Files.deleteIfExists() , который немного более читаем, чем исходный метод delete() из класса File.

Теперь возвращаемся к нашему первоначальному вопросу, как удалить папку с файлами или подпапку внутри нее. Что ж, нам нужно написать программу, которая может рекурсивно проверять все файлы и папки и удалять их перед удалением каталога верхнего уровня. В этом примере я создал структуру каталогов с одним каталогом, содержащим файл, и подкаталогом, содержащим другой файл, и попытался удалить верхний каталог, используя наш метод.

В этой программе у меня есть два перегруженных метода, deleteDirectory(файловый файл) и deleteDirectory(строковый путь), чтобы продемонстрировать правильный и неправильный способ удаления каталога в Java. Метод, который принимает аргумент String, сначала печатает все содержимое каталога без вывода содержимого подкаталога, а затем просто вызывает метод удаления для каталога, который мы хотим удалить. Этот метод не может удалить непустой каталог, поэтому он не работает и возвращает значение false, которое фиксируется в методе. Правильный способ удаления каталога с файлами — рекурсивное удаление любого подкаталога и файлов внутри него, что демонстрируется в методе deleteDirectory(File).

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

На этом все о том, как удалить непустую директорию с файлами в Java. Как вы можете видеть в выводе, метод, который принимает путь String, не может удалить наш каталог с файлами «один», вместо этого он потерпел неудачу, в то время как наш второй метод рекурсивно удалил все внутри этого каталога верхнего уровня, вы можете видеть, что файлы удалены перед каталогом, чтобы сделать их пустыми. Я не сильно тестировал этот код, но он должен работать на всех версиях Java, начиная с Java 1.2

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

Java предоставляет несколько методов для удаления каталога. Однако каталог должен быть очищен, прежде чем мы его удалим. Чтобы программно удалить все содержимое определенного каталога, нам нужно использовать рекурсию, как описано ниже:

    (файлы и подпапки) каталога, который нужно удалить.
  1. Удалить все обычные файлы текущего каталога (существующие из рекурсии).
  2. Для каждой подпапки текущего каталога вернитесь к шагу 1 (рекурсивный шаг).
  3. Удалить каталог.

Давайте рассмотрим различные способы реализации приведенного выше простого рекурсивного алгоритма.

В Java 8 или выше вы можете использовать Files.walk() из NIO API (классы в пакете java.nio.*) для рекурсивного удаления непустого каталога. Этот метод возвращает поток, который можно использовать для удаления всех файлов и подпапок, как показано ниже:

В приведенном выше примере Files.walk() возвращает Stream of Path . Мы отсортировали его в обратном порядке, чтобы разместить пути, указывающие на содержимое каталогов, перед самими каталогами. После этого он сопоставляет путь с файлом и удаляет каждый файл .

Чтобы удалить непустой каталог с помощью устаревшего API ввода-вывода Java, нам нужно вручную написать рекурсивную функцию для реализации описанного выше алгоритма. Вот как это выглядит:

Как вы можете видеть выше, мы используем метод File.listFiles() для вывода списка всех файлов и подкаталогов в каталоге. Для каждого файла мы рекурсивно вызываем метод deleteDir(). В конце мы удаляем каталог с помощью File.delete() .

Теперь вы можете вызвать описанный выше метод следующим образом:

Библиотека Apache Commons IO предоставляет метод FileUtils.deleteDirectory() для рекурсивного удаления каталога, включая все файлы и подкаталоги:

Не забудьте включить зависимость Apache Commons IO в файл pom.xml вашего проекта Maven:

Для проекта Gradle добавьте следующую зависимость в файл build.gralde:

Вас могут заинтересовать другие статьи о вводе-выводе по Java:

✌️ Понравилась статья? Следите за мной в Twitter и LinkedIn. Вы также можете подписаться на RSS-канал.

Учебники и публикации о Java, Spring, Hadoop и многом другом. Примеры кода Java и вопросы для интервью. Примеры кода Spring.

Понедельник, 9 сентября 2019 г.

Программа Java для рекурсивного удаления файлов и каталогов

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

Способы удаления файла или каталога в Java

  1. delete(). В классе java.io.File есть метод delete(), который удаляет файл или каталог, обозначенный этим абстрактным путем. Если этот путь обозначает каталог, то каталог должен быть пустым, чтобы его можно было удалить. Метод возвращает значение true, если файл или каталог успешно удалены; false в противном случае.
  2. Files.delete(Path path) — метод java.nio.file.Files.delete(), доступный в Java 7 и более поздних версиях, — это еще один вариант удаления файла в Java. Если файл является каталогом, то каталог должен быть пустым, чтобы его можно было удалить. Выдает исключение NoSuchFileException, если файл не существует, выдает исключение DirectoryNotEmptyException, если файл является каталогом и не может быть удален иначе, поскольку каталог не пуст.
  3. deleteIfExists(Path path) — метод java.nio.file.Files.deleteIfExists(), доступный начиная с Java 7, удаляет файл, если он существует. Если файл является каталогом, то каталог должен быть пустым. Выдает DirectoryNotEmptyException, если файл является каталогом и не может быть удален иначе, поскольку каталог не пуст.

Пример метода java.io.File delete() для удаления файла

Пример метода Files.delete() для удаления файла/каталога

Когда файл не существует или сценарий удаления непустого каталога с помощью метода Files.delete().

Пример метода Files.deleteIfExists() для удаления файла/каталога

Как видите, при попытке удалить непустой каталог возникает исключение.

Рекурсивное удаление каталога в Java

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

  • Файл.listFiles()
  • Files.walkFileTree java 7 и более поздних версий

Рекурсивное удаление каталога с помощью метода File.listFiles()

Метод listFiles() класса File возвращает массив абстрактных имен путей, обозначающих файлы в каталоге, обозначенном этим абстрактным путем. Вам нужно зациклить массив и рекурсивно просмотреть файлы для подкаталогов, чтобы сначала удалить эти файлы, а затем каталоги, достигающие родительского каталога.

Структура каталогов, использованная в примере.

Рекурсивное удаление каталога с помощью метода Java Files.walkFileTree

Используя метод walkFileTree(Начало пути, посетитель FileVisitor), вы можете пройти по дереву файлов.

Вам необходимо реализовать интерфейс FileVisitor, требуется реализация двух методов FileVisitor-

postVisitDirectory – удаление каталога, когда он пуст.
visitFile – удаление файлов при посещении.

Это все, что касается этой темы. Программа Java для рекурсивного удаления файлов и каталогов. Если у вас есть какие-либо сомнения или какие-либо предложения, пожалуйста, оставьте комментарий. Спасибо!

Читайте также: