Posts in category mklink

在 Linux 和 Windows 上使用 Java 处理 SymbolicLink 的一些事情

java.nio.file.Files 存在系列处理 “SymbolicLink” 的功能,实测可以支持 Linux 上的 “符号链接”,以及 Windows (NTFS 文件系统) 的 “NTFS 符号链接”(在 XP 中或称为 Junction)。


关于符号链接

  • Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接,ln -s 可以用于创建符号链接;
  • 在 Win7 之后, Windows 提供了 mklink 命令,用于创建符号链接;

    Windows 2000 - Windows XP 可以通过安装 junction 命令实现此功能,Junction 属于 Windows Sysinternals 软件包的一部分,目前可以在 https://docs.microsoft.com/en-us/sysinternals/downloads/junction 下载。


JDK 包含的相关 API 包括:


在 Windows 上创建符号链接的权限要求:

  • 在 Windows 上,系统默认的安全限制禁止非管理员权限的程序创建符号链接,在执行 createSymbolicLink 时会出现类似如下错误:
    java.nio.file.Files.createSymbolicLink 客户端没有所需的特权
    
  • 以 Windows 10 为例,可以在 本地安全策略 中进行设置:
    • 使用管理员权限打开 “命令提示符”:
    • 执行 secpol.msc,通过路径 安全设置 -> 本地策略 -> 用户权限分配 -> 创建符号链接 进行设置:
    • 设置完成后需要重新登录;

关于 java.io.File#getCanonicalPath()

  • 在 Linux 下,对于 Symbolic Link,getCanonicalPath() 将会返回链接指向的目标地址,而不是链接字面上的路径,所以合理的获取 File 对象的 CanonicalPath 的方法大致如下:
    if ( Packages.org.apache.commons.io.FileUtils.isSymlink(file) ){
        return java.nio.file.Paths.get(file.toURI()).normalize().toFile().getAbsolutePath();
    }else{
        return file.getCanonicalPath()+"";  //Force convert to javascript string
    }