Java 1.6 - 确定符号链接

msi*_*msi 42 java java-6

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

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

eri*_*son 45

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());
}
Run Code Online (Sandbox Code Playgroud)

  • 这在带有NTFS的Windows上不起作用(当使用mklink创建符号链接时). (7认同)

Esk*_*ola 13

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


Rob*_*ing 12

另外,请注意file.isFile()file.isDirectory()根据已解析的文件返回结果,因此两者都返回falsefile指的是目标不存在的符号链接.

(我知道这本身并不是一个有用的答案,但它让我绊倒了几次,所以我认为我应该分享)


Mic*_*ers 5

它看起来getCanonicalPath()可以做其他可能使它与绝对路径不同的事情.

如果需要,此方法首先将此路径名转换为绝对形式,就像调用getAbsolutePath()方法一样,然后以依赖于系统的方式将其映射到其唯一形式.这通常涉及删除冗余名称,例如"." 和路径名中的"..",解析符号链接(在UNIX平台上),并将驱动器号转换为标准情况(在Microsoft Windows平台上).

但它可能适用于绝大多数用例; 你的旅费可能会改变.