gpt4 book ai didi

java - 如何强制 Java 7 在 Windows 上创建 "directory symlinks"而不是 "file symlinks"?

转载 作者:可可西里 更新时间:2023-11-01 13:27:09 27 4
gpt4 key购买 nike

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

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

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

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

使用 Windows 的 native mklink 命令,可以强制链接类型为“目录符号链接(symbolic link)”。是否可以使用 native Java API 或某些库来实现此目的?

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

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

丑陋的。

最佳答案

不幸的是,我没有在 Java API 中看到执行此操作的方法。

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

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

属性本身源自 native 代码,看起来没有办法影响它们。

很明显,您还有其他选择,例如手动调用 mklink 或什至使用 PowerMock 之类的东西(这显然不是为了这个目的)来操纵返回的对象。

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

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

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

关于java - 如何强制 Java 7 在 Windows 上创建 "directory symlinks"而不是 "file symlinks"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12509132/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com