Удаление непустых каталогов в Java
Предположим, что у меня есть File f
, который представляет каталог, тогда f.delete()
удалит только каталог, если он пуст. Я нашел примеры в Интернете, которые используют File.listFiles()
или File.list()
, чтобы получить все файлы в каталоге, а затем рекурсивно пройти структуру каталогов и удалить все файлы. Однако, поскольку возможно создание бесконечно рекурсивных структур каталогов (как в Windows, так и в Linux (с символическими ссылками)), возможно, возможно, что программы, написанные в этом стиль никогда не завершится.
Итак, есть ли лучший способ написать такую программу, чтобы она не попадала в эти ловушки? Нужно ли мне отслеживать всюду, по которой я прошел, и убедиться, что я не обойдусь кругами или не получится лучше?
Обновление: В ответ на некоторые ответы (спасибо, ребята!) - я бы предпочел, чтобы код не следил за символическими ссылками и оставался в каталоге, который должен был удалить. Могу ли я полагаться на реализацию Commons-IO для этого, даже в случае Windows?
Ответы
Ответ 1
Если вы действительно хотите, чтобы ваше рекурсивное удаление каталога выполнялось через символические ссылки, я не думаю, что есть какой-либо независимый от платформы способ сделать это, не отслеживая все каталоги, которые вы прошли.
Однако в большинстве случаев я могу думать о том, что вы просто захотите удалить фактическую символическую ссылку, указывающую на каталог, а не рекурсивно следовать через символическую ссылку.
Если это то, что вам нужно, вы можете использовать метод FileUtils.deleteDirectory в Apache Commons IO.
Ответ 2
Попробуйте Apache Commons IO для протестированной реализации.
Однако, я не думаю, что это справляется с проблемой бесконечной рекурсии.
Ответ 3
File.getCanonicalPath() сообщит вам "реальное" имя файла, включая разрешенные символические ссылки. Во время сканирования вы сталкиваетесь с каталогом, который вы знаете (потому что вы сохранили их в Map).
Ответ 4
Если вы знаете, какие файлы являются символическими ссылками, вы можете просто пропустить их.
К сожалению, нет "чистого" способа обнаружения символических ссылок в Java. Отметьте это обходное решение чистой Java или этот, включающий собственный код.
Ответ 5
Как минимум в MacOSX, удаление символической ссылки в каталог не удаляет сам каталог и поэтому может быть удалено, даже если целевой каталог не пуст.
Я предполагаю, что это выполняется для большинства операционных систем POSIX. И, насколько я знаю, ссылки под окнами также являются просто файлами и могут быть удалены как таковые из программы Java.