Java: проверка наличия символьного файла ссылки

Мы говорим о java 1.6 здесь. Поскольку симбиотическая связь еще не поддерживается, как можно проверить их существование.

1: сообщите, что сам файл ссылки существует (верните true, даже если ссылка повреждена)

2: перейдите по ссылке и сообщите, существует ли основной файл.

Нет ли способа реализовать это, кроме JNI?

Ответ 2

Это медленно, но вы можете сравнить getAbsolutePath() и getCanonicalPath() файла. Поэтому используйте только за пределами критического кода кода производительности.

Ответ 3

Следующее должно дать вам начало:

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
    }
}

Забастовкa >

РЕДАКТИРОВАТЬ. Вышеизложенное не работает так, как я думал, потому что file.isDirectory() и file.isFile() разрешают символическую ссылку. (Мы живем и учимся!)

Если вы хотите получить точное определение, вам нужно будет использовать JNI, чтобы сделать соответствующие вызовы библиотеки, связанные с конкретной ОС.

Ответ 4

hmm.. еще не поддерживается.. будет ли он когда-либо поддерживаться - это вопрос, который приходит мне на ум, рассматривая этот вопрос... символические ссылки являются специфичными для платформы, а Java должна быть независимой от платформы. я сомневаюсь, что что-то подобное возможно с java как таковым.. вам, возможно, придется прибегнуть к собственному коду для этой части и использовать JNI для его объединения с остальной частью вашей программы в java.

Ответ 5

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

Не очень эффективный, но простой.