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

6
我正在使用Windows 64位系统下的Oracle Java 7。
当我使用Files.createSymbolicLink创建符号链接时,我注意到以下行为:
  1. 如果目标是一个文件夹,则创建“目录符号链接”。
  2. 如果目标是一个文件,则创建“文件符号链接”。
  3. 如果目标不存在,则创建“文件符号链接”。
符号链接的类型是固定的,并且不会因其目标的任何更改而改变
使用Windows的本机mklink命令,可以强制将链接类型设置为“目录符号链接”。是否可以使用本机Java API或某个库来实现此操作?
一个微不足道又丑陋的方法是:
  1. 如果目标是一个文件夹,只需创建链接
  2. 如果目标不存在,则创建一个新的空目标目录,创建链接,然后删除该目录。
  3. 如果目标是一个文件...处理它(移动它、应用#2,然后将其移回)。
糟糕透了。
1个回答

3

很遗憾,我在Java APIs中没有找到实现的方法。

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

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

这些属性本身来自原生代码,看起来没有办法对它们进行影响。
当然,您也可以选择手动调用mklink或使用类似PowerMock的东西来操作返回的对象(这明显不是为此目的而设计的)。
另一个不太优雅的选项是创建所有相关类的代理:Path、FileSystem和FileSystemProvider。它的工作方式是,Path返回FileSystem,FileSystem返回FileSystemProvider - 您需要修改FileSystemProvider.createSymbolicLink方法的行为方式。
createSymbolicLink方法接收一个varargs参数,目前未使用-您可以向其传递一个参数,指示您的包装器需要覆盖创建符号链接的方式,就这样 :)
写完所有这些后,我唯一的问题是-为什么您需要这种行为?

其实并没有太大的必要,我只是通过程序中的一个错误发现了这种行为,导致符号链接的目标未被创建。 - ripper234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接