解决Java中的目录符号链接问题

13
给定一个FilePath目录对象,我该如何检查它是否是符号链接并将其解析为实际目录?
我已经尝试了File.getCannonicalFile()Files.isSymbolicLink(Path)和许多其他方法,但似乎都不起作用。有趣的是,Files.isDirectory(Path)返回false,而Files.exists(Path)返回true。Java是否将符号链接视为文件而不是目录?

1
那么为什么 Files.isSymbolicLink 不起作用呢?你使用的是哪个操作系统?在 Linux 上对我来说运行得很好。 - Makoto
"它们似乎都不起作用" <-- 这相当模糊。在这种情况下,java.nio.file 可以正常工作。请展示你的代码。 - fge
1个回答

27

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

final Path realPath = path.toRealPath();

这将解析所有符号链接等。

然而,由于它可能会失败(例如,符号链接无法解析),因此您必须在此处处理IOException异常。

因此,如果您想测试符号链接是否指向一个现有的目录,则需要执行以下操作:

Files.isDirectory(path.toRealPath());

注意Files.exists()的一个细节:默认情况下,它会跟随符号链接

这意味着,如果您有一个符号链接作为path,它的目标不存在,则:

Files.exists(path)

将返回FALSE;但是这个:

Files.exists(path, LinkOption.NOFOLLOW_LINKS)

将返回TRUE。

在“Unix术语”中,这是stat()lstat()之间的区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接