如何强制Java 7在Windows上创建"目录符号链接"而不是"文件符号链接"?

rip*_*234 6 java windows symlink java-7

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

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

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

符号链接的类型是固定的,永远不会更改,无论其目标是否有任何更改.

使用Windows的本机mklink命令,可以强制链接类型为"目录符号链接".是否可以使用本机Java API或某些库实现此目的?

一个琐碎和丑陋的方式是:

  1. 如果目标是目录,只需创建链接
  2. 如果目标不存在,请创建新的空目标目录,创建链接并删除目录.
  3. 如果目标是文件......处理它(移动它,应用#2,将其移回).

的fugly.

Ron*_*onK 3

不幸的是,我在 Java API 中没有找到实现这一点的方法。

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

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

这些属性本身源自本机代码,看起来没有办法影响它们。

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

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

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

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