【问题标题】:How to force Java 7 to create "directory symlinks" on Windows instead of "file symlinks"?如何强制 Java 7 在 Windows 上创建“目录符号链接”而不是“文件符号链接”?
【发布时间】:2012-09-20 08:49:09
【问题描述】:

我在 Windows 64 位上使用 Oracle Java 7。

当我使用 Files.createSymbolicLink 创建符号链接时,我注意到了这种行为:

  1. 如果目标是目录,则会创建“目录符号链接”。
  2. 如果目标是文件,则会创建“文件符号链接”。
  3. 如果目标不存在,则创建“文件符号链接”。

The type of the symlink is fixed and never changes,无论其目标有何变化。

使用 Windows 的原生 mklink 命令,可以强制链接类型为“目录符号链接”。是否可以使用本机 Java API 或某些库来实现这一点?

一种琐碎而丑陋的方法是:

  1. 如果目标是目录,只需创建链接
  2. 如果目标不存在,则新建一个空目标目录,创建链接,然后删除目录。
  3. 如果目标是一个文件...处理它(移动它,应用 #2,将它移回)。

丑陋的。

【问题讨论】:

    标签: java windows symlink java-7


    【解决方案1】:

    很遗憾,我在 Java API 中看不到这样做的方法。

    我检查了 Windows JRE 代码,看起来决定是基于文件属性本身:

    try
    {
       WindowsFileAttributes windowsfileattributes = WindowsFileAttributes.get(windowspath2, false);
       if(windowsfileattributes.isDirectory() || windowsfileattributes.isDirectoryLink())
          i |= 1;
    }
    

    属性本身来源于native代码,看起来没有办法影响它们。

    显然,您还有其他选择,例如手动调用 mklink,甚至使用 PowerMock 之类的东西来操作返回的对象(这显然不是为此目的)。

    另一个肮脏的选择是创建所有相关类的代理:PathFileSystemFileSystemProvider
    它的工作方式是 Path 返回一个 FileSystem,它返回一个 FileSystemProvider - 您需要做的是修改 FileSystemProvider.createSymbolicLink 方法的行为方式。

    createSymbolicLink 方法接收一个当前未使用的 varargs 参数 - 您可以向它传递一个参数,该参数将指示您的包装器它需要覆盖创建符号链接的方式 - 然后就可以了 :)

    写完所有这些之后——我唯一的问题是——你为什么需要这种行为?

    【讨论】:

    • 其实没什么大不了的,我只是通过程序中的一个错误发现了这种行为,导致符号链接的目标无法创建。
    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多