Подтвердить что ты не робот

Удаление непустых каталогов в Java

Предположим, что у меня есть File f, который представляет каталог, тогда f.delete() удалит только каталог, если он пуст. Я нашел примеры в Интернете, которые используют File.listFiles() или File.list(), чтобы получить все файлы в каталоге, а затем рекурсивно пройти структуру каталогов и удалить все файлы. Однако, поскольку возможно создание бесконечно рекурсивных структур каталогов (как в Windows, так и в Linux (с символическими ссылками)), возможно, возможно, что программы, написанные в этом стиль никогда не завершится.

Итак, есть ли лучший способ написать такую ​​программу, чтобы она не попадала в эти ловушки? Нужно ли мне отслеживать всюду, по которой я прошел, и убедиться, что я не обойдусь кругами или не получится лучше?

Обновление: В ответ на некоторые ответы (спасибо, ребята!) - я бы предпочел, чтобы код не следил за символическими ссылками и оставался в каталоге, который должен был удалить. Могу ли я полагаться на реализацию Commons-IO для этого, даже в случае Windows?

4b9b3361

Ответ 1

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

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

Если это то, что вам нужно, вы можете использовать метод FileUtils.deleteDirectory в Apache Commons IO.

Ответ 2

Попробуйте Apache Commons IO для протестированной реализации.

Однако, я не думаю, что это справляется с проблемой бесконечной рекурсии.

Ответ 3

File.getCanonicalPath() сообщит вам "реальное" имя файла, включая разрешенные символические ссылки. Во время сканирования вы сталкиваетесь с каталогом, который вы знаете (потому что вы сохранили их в Map).

Ответ 4

Если вы знаете, какие файлы являются символическими ссылками, вы можете просто пропустить их.

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

Ответ 5

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

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