Скопировать символическую ссылку в папку, используя Java - PullRequest
1 голос
/ 19 мая 2019

Я ищу способ скопировать символическую ссылку в каталог.На самом деле, с моим приложением я могу скопировать каталог в каталог и файлы в каталог.

Я использовал библиотеку commons.io.FileUtils

Вот пример:

FileUtils.copyDirectoryToDirectory(file, destination);

Теперь я хочу сделать то же самое с символической ссылкой.Например, допустим, что есть символическая ссылка в / home / user / Desktop / mysymlink и репозиторий / home / user / Desktop / destination

Я хочу скопировать mysymlink в destination.

Я пробовал это:

Files.createSymbolicLink(new File("/path/to/symlink").toPath(), new File("/path/to/destination".toPath())

Но я иду эту ошибку:

java.nio.file.FileAlreadyExistsException: /home/nemtecl/Bureau/montest
    at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:94)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
    at java.base/sun.nio.fs.UnixFileSystemProvider.createSymbolicLink(UnixFileSystemProvider.java:458)
    at java.base/java.nio.file.Files.createSymbolicLink(Files.java:1058)
    at copyapp.file.CopySymbolicLink.copy(CopySymbolicLink.java:24)
    at copyapp.model.CopyAppModel.copyFile(CopyAppModel.java:68)
    at copyapp.instanciation.SwingApp.createController(SwingApp.java:116)
    at copyapp.instanciation.SwingApp.<init>(SwingApp.java:30)
    at copyapp.instanciation.SwingAppFactory.createApplication(SwingAppFactory.java:8)
    at copyapp.client.mycp.main(mycp.java:29)

Можете ли вы помочь мне:)?

1 Ответ

0 голосов
/ 19 мая 2019

Ваше использование createSymbolicLink имеет две проблемы: как указывает RealSkeptic, ваши первые два параметра меняются местами (они не должны быть в том же порядке, что и команда ln -s);и в отличие от ln -s, адресат может не быть каталогом, это должен быть полный путь без каталога.

Однако для копирования существующей символической ссылки вы нена самом деле хотите Files.createSymbolicLink.Вы хотите скопировать саму ссылку, что можно сделать, указав LinkOption.NOFOLLOW_LINKS в обычную копию.

Из документации Files.copy :

NOFOLLOW_LINKS

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

Итак, вы хотите что-то вроде этого:

Files.copy(
    Paths.get("/home/user/Desktop/mysymlink"),
    Paths.get("/home/user/Desktop/destination", "mysymlink"),
    LinkOption.NOFOLLOW_LINKS,
    StandardCopyOption.REPLACE_EXISTING);

(Обратите внимание, что правильный путь для получения пути заключается в Paths.get , или, какJava 11, Path.of . Нет причин использовать java.io.File.)

...