解析 Java 中的目录符号链接

Resolving Directory Symlink in Java

给定一个 FilePath 目录对象,如何检查它是否是符号链接以及如何将其解析为实际目录?

我试过 File.getCannonicalFile()Files.isSymbolicLink(Path) 和许多其他方法,但其中 none 似乎有效。一件有趣的事情是 Files.isDirectory(Path) returns 为假,而 Files.exists(Path) 为真。 java 是否将符号链接视为文件而不是目录?

如果要完全解析一个Path指向实际内容,使用.toRealPath():

final Path realPath = path.toRealPath();

这将解析所有符号 links 等

但是,由于这可能会失败(例如,symlink 无法解析),您必须在此处处理 IOException

因此,如果你想测试一个 symlink 是否指向一个 existing 目录,你必须这样做:

Files.isDirectory(path.toRealPath());

注意 Files.exists() 的一个微妙之处:默认情况下,它遵循符号 links

这意味着如果你有一个符号 link 作为一个 path 其目标不存在,那么:

Files.exists(path)

将 return 假;但是这个:

Files.exists(path, LinkOption.NOFOLLOW_LINKS)

将 return 为真。

在"Unix parlance"中,这是stat()lstat()的区别。