Два способа потерпеть неудачу с символическими ссылками и приведенным выше кодом ... и не знаете решения.
Способ № 1
Запустите это, чтобы создать тест:
echo test > testfile
mkdir dirtodelete
ln -s badlink dirtodelete/badlinktodelete
Здесь вы видите свой тестовый файл и тестовый каталог:
$ ls testfile dirtodelete
testfile
dirtodelete:
linktodelete
Затем запустите ваш commons-io deleteDirectory (). Вылетает, говоря, что файл не найден. Не уверен, что другие примеры делают здесь. Команда Linux rm просто удалит ссылку, а rm -r в каталоге также.
Exception in thread "main" java.io.FileNotFoundException: File does not exist: /tmp/dirtodelete/linktodelete
Способ № 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: