2012-09-20 83 views
6

我在Windows 64位上使用Oracle Java 7。如何强制Java 7在Windows上创建“目录符号链接”而不是“文件符号链接”?

当我创建使用Files.createSymbolicLink一个符号,我注意到此行为:

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

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

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

一个微不足道的和丑陋的方式是:

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

Fugly。

回答

2

不幸的是我没有在Java API中看到一种方法来做到这一点。

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

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

的属性本身从本地代码起源,它看起来像有没有办法影响他们。

很明显,你有其他选择,如手动调用mklink或甚至使用像PowerMock(这显然不是为此目的)的操纵返回的对象。

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

createSymbolicLink方法接收当前未使用的可变参数的参数 - 你可以传递参数给它,这将表明您的包装,它需要覆盖符号链接的创建方法 - 和你去:)

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

+0

其实没有什么太大的需求,我只是通过程序中的一个错误发现了这种行为,导致符号链接的目标不被创建。 – ripper234