如何强制Java7创建;目录符号链接“;在Windows上,而不是“上”;文件符号链接;?
我在Windows 64位上使用Oracle Java 7 使用创建符号链接时,我注意到以下行为:如何强制Java7创建;目录符号链接“;在Windows上,而不是“上”;文件符号链接;?,java,windows,symlink,java-7,Java,Windows,Symlink,Java 7,我在Windows 64位上使用Oracle Java 7 使用创建符号链接时,我注意到以下行为: 如果目标是目录,则创建“目录符号链接” 如果目标是文件,则创建“文件符号链接” 如果目标不存在,则创建“文件符号链接” ,而不考虑其目标的任何更改 使用Windows的nativemklink命令,可以强制链接类型为“目录符号链接”。是否可以使用本机JavaAPI或某些库来实现这一点 一种琐碎而丑陋的方式是: 如果目标是目录,只需创建链接 如果目标不存在,请创建一个新的空目标目录,创建链接,然后删
mklink
命令,可以强制链接类型为“目录符号链接”。是否可以使用本机JavaAPI或某些库来实现这一点
一种琐碎而丑陋的方式是:
Fugly.不幸的是,我在Java API中找不到这样做的方法 我检查了Windows JRE代码,看起来决定是基于文件属性本身:
try
{
WindowsFileAttributes windowsfileattributes = WindowsFileAttributes.get(windowspath2, false);
if(windowsfileattributes.isDirectory() || windowsfileattributes.isDirectoryLink())
i |= 1;
}
属性本身来源于本机代码,看起来没有办法影响它们
显然,您还有其他选项,比如手动调用mklink
,甚至使用PowerMock
之类的工具操作返回的对象(这显然不是为了这个目的)
另一个脏选项是创建所有相关类的代理:Path
、FileSystem
和FileSystemProvider
它的工作方式是
路径
返回一个文件系统
,它返回一个文件系统提供程序
——您需要做的是修改文件系统提供程序.createSymbolicLink
方法的行为
createSymbolicLink
方法接收一个当前未使用的varargs参数-您可以向它传递一个参数,该参数将指示包装器需要覆盖符号链接的创建方式-接下来就是:)
写了所有这些之后——我唯一的问题是——你为什么需要这种行为?实际上没有太大的需要,我只是通过程序中的一个错误发现了这种行为,导致符号链接的目标无法创建。