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

时间:2010-02-01 09:31:20

标签: java symlink

我们在这里讨论java 1.6。由于尚未支持symoblic链接,如何检查它们的存在。

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

2:按照链接告诉我们底层文件存在。

除了JNI,真的没办法实现这个吗?

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:5)

它很慢但您可以比较文件的getAbsolutePath()和getCanonicalPath()。因此,只能在性能关键代码路径之外使用。

答案 2 :(得分: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进行相关的本机操作系统特定库调用。

答案 3 :(得分:1)

嗯...还不支持..它是否会受到支持是我脑子里想到这个问题的问题......符号链接是特定于平台的,而Java应该是独立于平台的。我怀疑java是否可以使用这种类型的东西......你可能不得不求助于这部分的本机代码,并使用JNI将它与java中的其余程序桥接。

答案 4 :(得分:0)

#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);
}

不是非常有效但很直接。