Удаление непустых каталогов в Java - PullRequest
28 голосов
/ 18 февраля 2009

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

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

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

Ответы [ 5 ]

32 голосов
/ 18 февраля 2009

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

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

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

7 голосов
/ 18 февраля 2009

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

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

3 голосов
/ 18 февраля 2009

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

0 голосов
/ 18 февраля 2009

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

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

0 голосов
/ 18 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...