6

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

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

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

符号链接的类型是固定的,永远不会改变,不管它的目标有什么改变。

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

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

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

丑陋的。

4

1 回答 1

3

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

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

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

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

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

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

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

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

于 2012-10-03T11:57:26.700 回答