在Java中检测符号链接

22

如何检测一个Java 'File'对象是否指向一个符号链接?

(如果有帮助/关系的话,我知道该文件是指向一个目录而不是文件)

2个回答

35

File.getCanonicalPath() 解决符号链接问题。

规范路径名是绝对且唯一的。规范形式的具体定义取决于系统。如果必要,此方法首先将该路径名转换为绝对路径名,就像调用 getAbsolutePath() 方法一样,然后以系统相关方式将其映射到其唯一形式。这通常涉及从路径名中删除冗余名称(如“.”和“..”),解析符号链接(在UNIX平台上),并将驱动器号转换为标准大小写(在Microsoft Windows平台上)。

我认为您可以比较 getCanonicalPath()getAbsolutePath() 的结果。

更新:看起来已经有人问过这个问题,请查看那里的答案


1
听起来可能行 - 我想知道调用真实文件系统对象的成本是多少(我假设需要检查树上每个目录,而我只关心最后一个)... - Matt Sheppard
1
谢谢 - 使用Apache的commons IO,如https://dev59.com/W7nEzYgBFxS5KdRjzTQi#813730中所述,似乎是一个很好的解决方案。 - Matt Sheppard

28

有一个警告 - 就像 Files.exists 一样,Files.isSymbolicLink 有时可能会返回错误的负值。 - Hakanai
@Hakanai,你能提供一个例子吗? - auraham
@auraham 如果在检查信息时发生异常,该方法将吞噬异常并返回false,无论文件是否为符号链接。因此,在许多情况下,对于Files.exists(),您实际上想要的是!Files.notExists()。但这也不是100%的情况。这种混乱导致我们禁止在我们的代码库中使用这些方法,将调用重定向到我们自己的版本,以抛出异常。 - Hakanai

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