Ответ 1
выглядит так на данный момент... если вы не идете с openjdk http://openjdk.java.net/projects/nio/javadoc/java/nio/file/attribute/BasicFileAttributes.html#isSymbolicLink()
Мы говорим о java 1.6 здесь. Поскольку симбиотическая связь еще не поддерживается, как можно проверить их существование.
1: сообщите, что сам файл ссылки существует (верните true, даже если ссылка повреждена)
2: перейдите по ссылке и сообщите, существует ли основной файл.
Нет ли способа реализовать это, кроме JNI?
выглядит так на данный момент... если вы не идете с openjdk http://openjdk.java.net/projects/nio/javadoc/java/nio/file/attribute/BasicFileAttributes.html#isSymbolicLink()
Это медленно, но вы можете сравнить getAbsolutePath() и getCanonicalPath() файла. Поэтому используйте только за пределами критического кода кода производительности.
Следующее должно дать вам начало:
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, чтобы сделать соответствующие вызовы библиотеки, связанные с конкретной ОС.
hmm.. еще не поддерживается.. будет ли он когда-либо поддерживаться - это вопрос, который приходит мне на ум, рассматривая этот вопрос... символические ссылки являются специфичными для платформы, а Java должна быть независимой от платформы. я сомневаюсь, что что-то подобное возможно с java как таковым.. вам, возможно, придется прибегнуть к собственному коду для этой части и использовать JNI для его объединения с остальной частью вашей программы в java.
# 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);
}
Не очень эффективный, но простой.