我們在這裏討論java 1.6。由於symoblic鏈接尚未得到支持,因此如何檢查它們的存在。Java:檢查符號鏈接文件是否存在
1:告訴wheather鏈接文件本身存在(即使該鏈接被打破返回true)
2:按照鏈接,並告訴wheather底層文件存在。
除JNI之外是否真的沒有辦法實現這個?
我們在這裏討論java 1.6。由於symoblic鏈接尚未得到支持,因此如何檢查它們的存在。Java:檢查符號鏈接文件是否存在
1:告訴wheather鏈接文件本身存在(即使該鏈接被打破返回true)
2:按照鏈接,並告訴wheather底層文件存在。
除JNI之外是否真的沒有辦法實現這個?
看起來是這樣,現在......除非你用的OpenJDK去http://openjdk.java.net/projects/nio/javadoc/java/nio/file/attribute/BasicFileAttributes.html#isSymbolicLink()
只是萬一任何人會想知道,靜態方法你可以使用'java.nio.file.Files.isSymbolicLink(路徑路徑)'。 – konsolebox 2014-05-18 09:46:12
下應該給你一個開始:
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進行相關的本地操作系統特定的庫調用。
嗯..還沒有支持..將永遠支持是我想到這個問題時想到的問題......符號鏈接是特定於平臺的,Java應該是平臺獨立的。我懷疑這種類型的東西是否可能與Java一樣,你可能不得不求助於這部分的本地代碼,並使用JNI將它與Java中的其餘程序聯繫起來。
它很慢,但您可以比較文件的getAbsolutePath()和getCanonicalPath()。所以只能在關鍵性能代碼路徑之外使用。
這不適用於Windows鏈接,只適用於* nix符號鏈接。 – searchengine27 2015-07-25 19:02:46
#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);
}
不是非常有效的,但簡單。
從Apache FileUtils複製的更好的解決方案可以在這裏找到:http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Gray 2012-04-23 19:30:08