Два способа отказа с символическими ссылками и приведенный выше код ... и не знают решения.
Way # 1
Выполнить это, чтобы создать тест:
echo test > testfile
mkdir dirtodelete
ln -s badlink dirtodelete/badlinktodelete
Здесь вы видите файл теста и тестовый каталог:
$ ls testfile dirtodelete
testfile
dirtodelete:
linktodelete
затем запустить Обще-ю deleteDirectory (). Он падает, говоря, что файл не найден. Не знаете, что здесь делают другие примеры. Команда Linux rm просто удалит ссылку, а также rm -r в каталоге.
Exception in thread "main" java.io.FileNotFoundException: File does not exist: /tmp/dirtodelete/linktodelete
Way # 2
Выполнить это, чтобы создать тест:
mkdir testdir
echo test > testdir/testfile
mkdir dirtodelete
ln -s ../testdir dirtodelete/dirlinktodelete
Здесь вы видите файл теста и тестовый каталог:
$ ls dirtodelete testdir
dirtodelete:
dirlinktodelete
testdir:
testfile
Затем запустить свой commons- io deleteDirectory() или примеры кода, опубликованные пользователем. Он удаляет не только каталог, но и ваш тестовый файл, который находится за пределами удаляемого каталога. (Он разыменовывает каталог неявно и удаляет содержимое). rm -r удалит только ссылку. Вам нужно использовать что-то вроде этого, удаляя разыменованные файлы: «find -L dirtodelete -type f -exec rm {} \;".
$ ls dirtodelete testdir
ls: cannot access dirtodelete: No such file or directory
testdir:
Файл.delete() должен просто возвращать false при вызове его с непустым каталогом. –
Если вы используете Java 8, см. Ответ @ RoK. – Robin