使用Java将符号链接复制到文件夹

时间:2019-05-19 13:02:21

标签: java symlink

我正在寻找一种将符号链接复制到目录的方法。 实际上,通过我的应用程序,我可以将目录复制到目录,并将文件复制到目录。

我使用了commons.io.FileUtils库

这里是一个例子:

FileUtils.copyDirectoryToDirectory(file, destination);

现在,我想对符号链接做同样的事情。 例如,假设在/ home / user / Desktop / mysymlink中有一个符号链接 和一个存储库/ home / user / Desktop / destination

我想将mysymlink复制到目的地。

我尝试过这个:

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 :(得分:0)

您对createSymbolicLink的使用有两个问题:正如RealSkeptic指出的那样,您的前两个参数是相反的(它们的顺序不应与ln -s命令相同);与ln -s不同,目的地可能不是目录,而必须是完整的非目录路径。

但是,对于复制现有的符号链接,实际上并不需要Files.createSymbolicLink。您想要复制链接本身,可以通过将LinkOption.NOFOLLOW_LINKS指定为常规副本来完成。

来自documentation of 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。)