2010-02-01 14 views
12

Hablamos de java 1.6 aquí. Dado que el enlace symoblic aún no es compatible, ¿cómo puede examinarse la existencia de ellos?Java: verificar existencia de archivo de enlace simbólico

1: decirle tiempo lo existe el archivo propio enlace (return true incluso si se rompe el vínculo)

2: siga el enlace y decirle tiempo lo subyacente existe el archivo.

¿Realmente no hay forma de darse cuenta de esto, excepto JNI?

+0

Una mejor solución copiada de Apache FileUtils se puede encontrar aquí: http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Gray

Respuesta

1

Lo que sigue debe darle un nuevo comienzo:

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

EDITAR: Lo anterior Don No funcionó como pensé porque file.isDirectory() y file.isFile() resuelven un enlace simbólico. (¡Vivimos y aprendemos!)

Si desea una determinación precisa, deberá usar JNI para realizar las llamadas a bibliotecas nativas relevantes del sistema operativo.

+0

Gracias, pero file.exists() devolverá false para el enlace simbólico, creo. – solotim

+1

No funciona en Linux. Desafortunadamente, file.isFile() y file.isDirectory() resuelven un enlace simbólico y devuelven un resultado en función del tipo del objeto resuelto. –

+0

Devuelve falso en Linux. También puede consultar la parte de evaluación de http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4956115. – solotim

1

hmm ... aún no soportado ... siempre será compatible la pregunta que me viene a la mente al analizar esta pregunta ... los enlaces simbólicos son específicos de la plataforma y se supone que Java es independiente de la plataforma. dudo que algo así sea posible con java como tal ... puede que tenga que recurrir al código nativo para esta parte y usar JNI para vincularlo con el resto de su programa en java.

+1

Java1.7 va a implementar una interfaz de enlace simbólico, entonces, ¿cuál es su consideración para la plataforma independiente? – solotim

+0

hmm..esto es interesante..tienes que echar un vistazo a esto: http: // stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Aadith

5

Es lento pero puede comparar getAbsolutePath() y getCanonicalPath() de un archivo. Por lo tanto, use solo fuera de una ruta de código crítico de rendimiento.

+1

Esto no funciona para los enlaces de Windows, solo enlaces simbólicos * nix. – searchengine27

0

# 2 es fácil: simplemente use File.isFile etc., que atravesará el enlace. La parte difícil es # 1.

lo tanto, si no se puede utilizar java.nio.file, y desea evitar JNI etc., lo único que he encontrado que funciona:

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

No es terriblemente eficiente, pero sencillo.

Cuestiones relacionadas