it-swarm.dev

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

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

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

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

28
Martin McNulty

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

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

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

32
Il-Bhima

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

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

7
Joshua Fox

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

3
Bombe

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

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

0
Morendil

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

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

0
Sebastian Ganslandt