2010-02-01 20 views
12

Mówimy tutaj o java 1.6. Ponieważ łącze symoblik nie jest jeszcze obsługiwane, jak można zbadać ich istnienie.Java: sprawdź istnienie pliku dowiązania symbolicznego

1: powiedzieć pogodowymi istnieje sam plik Link (return true nawet jeśli link jest uszkodzony)

2: w link i powiedz pogodowymi bazowy istnieje plik.

Czy naprawdę nie można tego zrozumieć, z wyjątkiem JNI?

+0

Lepsze rozwiązanie skopiowane z Apache FileUtils można znaleźć tutaj: http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Gray

Odpowiedz

1

Poniższy powinno dać start:

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

EDIT: Powyższa don działa tak jak myślałem, ponieważ file.isDirectory() i file.isFile() rozwiązują dowiązanie symboliczne. (Żyjemy i uczymy się!)

Jeśli chcesz dokładnego określenia, będziesz musiał użyć JNI, aby wykonać odpowiednie wywołania biblioteki właściwe dla systemu operacyjnego.

+0

Dzięki, ale file.exists() zwróci wartość false dla symbolicznego linku, jak sądzę. – solotim

+1

Nie działa w systemie Linux. Niestety, file.isFile() i file.isDirectory() rozwiązują dowiązanie symboliczne i zwracają wynik na podstawie typu rozwiązanego obiektu. –

+0

Zwraca wartość false w systemie Linux. Możesz także odnieść część ewaluacyjną http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4956115. – solotim

1

hmm .. nie jest jeszcze obsługiwany ... czy kiedykolwiek będzie obsługiwane to pytanie, które przychodzi mi na myśl, patrząc na to pytanie ... linki symboliczne są specyficzne dla platformy i Java ma być niezależna od platformy. Wątpię, czy cokolwiek w tym rodzaju jest możliwe z Javą jako taką. Może będziesz musiał odwołać się do natywnego kodu dla tej części i użyć JNI, aby połączyć go z resztą twojego programu w java.

+1

Java1.7 zamierza zaimplementować interfejs symboliczny-link, więc co jest dla nich niezależne? – solotim

+0

hmm..twoje interesujące .. możesz chcieć spojrzeć na to: http: // stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Aadith

5

Jest powolny, ale można porównać metody getAbsolutePath() i getCanonicalPath() pliku. Dlatego używaj tylko poza krytyczną ścieżką kodu wydajności.

+1

To nie działa dla linków Windows, tylko * symboliczne dowiązania symboliczne. – searchengine27

0

# 2 jest łatwe: wystarczy użyć File.isFile itp., Które będą przechodzić przez łącze. Najtrudniejsza część to # 1.

Więc jeśli nie można użyć java.nio.file i chcesz uniknąć JNI itd jedyną rzeczą znalazłem, który działa:

static boolean exists(File link) { 
    File[] kids = link.getParentFile().listFiles(); 
    return kids != null && Arrays.asList(kids).contains(link); 
} 

Nie strasznie skuteczny, ale proste.

Powiązane problemy