2010-02-01 57 views
12

我們在這裏討論java 1.6。由於symoblic鏈接尚未得到支持,因此如何檢查它們的存在。Java:檢查符號鏈接文件是否存在

1:告訴wheather鏈接文件本身存在(即使該鏈接被打破返回true)

2:按照鏈接,並告訴wheather底層文件存在。

除JNI之外是否真的沒有辦法實現這個?

+0

從Apache FileUtils複製的更好的解決方案可以在這裏找到:http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Gray 2012-04-23 19:30:08

回答

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進行相關的本地操作系統特定的庫調用。

+0

謝謝,但是我認爲file.exists()將爲符號鏈接返回false。 – solotim 2010-02-01 09:55:02

+1

它不在Linux上。但不幸的是,file.isFile()和file.isDirectory()解析了一個符號鏈接,並根據解析對象的類型返回了一個結果。 – 2010-02-01 10:25:46

+0

它在Linux上返回false。您也可以參考http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4956115的評估部分。 – solotim 2010-02-03 03:24:57

1

嗯..還沒有支持..將永遠支持是我想到這個問題時想到的問題......符號鏈接是特定於平臺的,Java應該是平臺獨立的。我懷疑這種類型的東西是否可能與Java一樣,你可能不得不求助於這部分的本地代碼,並使用JNI將它與Java中的其餘程序聯繫起來。

+1

Java1.7將實現符號鏈接接口,那麼他們對平臺無關的考慮是什麼? – solotim 2010-02-03 02:21:38

+0

嗯..有趣的..你可能想看看這個:http:// stackoverflow。com/questions/813710/java-1-6 -definition-symbolic-links – Aadith 2010-02-03 05:47:18

5

它很慢,但您可以比較文件的getAbsolutePath()和getCanonicalPath()。所以只能在關鍵性能代碼路徑之外使用。

+1

這不適用於Windows鏈接,只適用於* nix符號鏈接。 – searchengine27 2015-07-25 19:02:46

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

不是非常有效的,但簡單。

相關問題