Java 1.6 - 确定符号链接

2022-09-01 00:56:46

在 DirectoryWalker 类中,我想找出 File 实例是否实际上是指向目录的符号链接(假设步行者在 UNIX 系统上行走)。鉴于我已经知道实例是一个目录,以下是否是确定符号链接的可靠条件?

File file;
// ...      
if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
    // real directory ---> do normal stuff      
}
else {
    // possible symbolic link ---> do link stuff
}

答案 1

Apache Commons中使用的技术使用父目录的规范路径,而不是文件本身。我不认为您可以保证不匹配是由于符号链接引起的,但这很好地表明该文件需要特殊处理。

这是Apache代码(受其许可证的约束),经过修改以使其紧凑。

public static boolean isSymlink(File file) throws IOException {
  if (file == null)
    throw new NullPointerException("File must not be null");
  File canon;
  if (file.getParent() == null) {
    canon = file;
  } else {
    File canonDir = file.getParentFile().getCanonicalFile();
    canon = new File(canonDir, file.getName());
  }
  return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
}

答案 2

Java 1.6 不提供对文件系统的这种低级访问。看起来应该包含在Java 1.7中的NIO 2将支持符号链接。新 API 的草稿已提供。那里提到了符号链接,可以创建遵循它们。我不完全确定应该使用哪种方法来找出文件是否是符号链接。有一个讨论NIO 2的邮件列表 - 也许他们会知道的。


推荐