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

如何强制Java7创建;目录符号链接“;在Windows上,而不是“上”;文件符号链接;?,java,windows,symlink,java-7,Java,Windows,Symlink,Java 7,我在Windows 64位上使用Oracle Java 7 使用创建符号链接时,我注意到以下行为: 如果目标是目录,则创建“目录符号链接” 如果目标是文件,则创建“文件符号链接” 如果目标不存在,则创建“文件符号链接” ,而不考虑其目标的任何更改 使用Windows的nativemklink命令,可以强制链接类型为“目录符号链接”。是否可以使用本机JavaAPI或某些库来实现这一点 一种琐碎而丑陋的方式是: 如果目标是目录,只需创建链接 如果目标不存在,请创建一个新的空目标目录,创建链接,然后删

我在Windows 64位上使用Oracle Java 7

使用创建符号链接时,我注意到以下行为:

  • 如果目标是目录,则创建“目录符号链接”
  • 如果目标是文件,则创建“文件符号链接”
  • 如果目标不存在,则创建“文件符号链接”
  • ,而不考虑其目标的任何更改

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

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

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

  • 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参数-您可以向它传递一个参数,该参数将指示包装器需要覆盖符号链接的创建方式-接下来就是:)


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

    实际上没有太大的需要,我只是通过程序中的一个错误发现了这种行为,导致符号链接的目标无法创建。