Java:检查符号链接文件是否存在

12

我们在这里讨论的是Java 1.6。由于符号链接尚未得到支持,如何检查它们的存在。

1:告诉是否存在链接文件本身(即使链接已断开也返回true)

2:跟随链接并告知基础文件是否存在。

除了JNI真的没有其他实现方法吗?


可以在此处找到从Apache FileUtils复制的更好的解决方案:https://dev59.com/W7nEzYgBFxS5KdRjzTQi - Gray
5个回答

5

3
万一有人想知道,您可以使用的静态方法是 java.nio.file.Files.isSymbolicLink(Path path) - konsolebox
1
现在链接返回404错误,这就是为什么在添加任何链接到你的答案之前,你应该格外小心的原因。 - Deepesh kumar Gupta

5

虽然较慢,但你可以比较File类的getAbsolutePath()和getCanonicalPath()方法。因此,请仅在非关键性代码路径外使用。


1
这对于Windows链接无效,只适用于*nix符号链接。 - searchengine27

1

以下内容应该可以帮助你入门:

if (file.exists() && !file.isDirectory() && !file.isFile()) {
    // it is a symbolic link (or a named pipe/socket, or maybe some other things)
}

if (file.exists()) {
    try {
        file.getCanonicalFile();
    } catch (FileNotFoundException ex) {
        // it is a broken symbolic link
    }
}

编辑:上述代码无法达到预期效果,因为file.isDirectory()和file.isFile()会解析符号链接。(我们学习进步!)
如果您想要准确地判断,您需要使用JNI调用相关的本地操作系统库。

谢谢,但我认为file.exists()对于符号链接会返回false。 - solotim
1
它在Linux上不起作用。但不幸的是,file.isFile()和file.isDirectory()会解析符号链接并返回基于已解析对象类型的结果。 - Stephen C
在Linux上它会返回false。您还可以参考http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4956115的评估部分。 - solotim
@solotim - 当我在Linux上测试符号链接到现有文件时,它返回“true”。关键是它会同时测试链接和链接目标是否存在。 - Stephen C

1
#2很容易:只需使用File.isFile等即可,这将遍历链接。难点在于#1。
因此,如果您无法使用java.nio.file并希望避免JNI等,则我发现唯一有效的方法是:
static boolean exists(File link) {
    File[] kids = link.getParentFile().listFiles();
    return kids != null && Arrays.asList(kids).contains(link);
}

不是非常高效,但很直接。

1

嗯...目前还不支持...看到这个问题,我想到的问题是它是否会被支持...符号链接是平台特定的,而Java应该是平台无关的。我怀疑在Java中是否可能实现这样的功能...你可能需要使用本地代码来完成这部分工作,并使用JNI将其与Java程序的其他部分连接起来。


1
Java1.7将实现符号链接接口,那么他们在考虑平台独立性方面有哪些考虑呢? - solotim
嗯..这很有趣..您可能想看一下这个:https://dev59.com/W7nEzYgBFxS5KdRjzTQi - Aadith Ramia

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