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

时间:2012-09-20 08:49:09

标签: java windows symlink java-7

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

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

  1. 如果目标是目录,则会创建“目录符号链接”。
  2. 如果目标是文件,则会创建“文件符号链接”。
  3. 如果目标不存在,则会创建“文件符号链接”。
  4. The type of the symlink is fixed and never changes,无论其目标有任何变化。

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

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

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

1 个答案:

答案 0 :(得分:2)

不幸的是,我没有在Java API中看到这样做的方法。

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

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

属性本身来自原生代码,看起来无法影响它们。

显然,您还可以使用其他选项,例如手动调用mklink,甚至使用PowerMock之类的操作来处理返回的对象(显然不是为此目的)。

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

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

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