2011-09-02 28 views
8

Estoy escaneando todos los directorios comenzando desde "/" para encontrar algunos directorios en particular como "MI CARPETA". Sin embargo, la carpeta es que obtengo instancias dobles de la misma carpeta. Esto ocurre porque una carpeta se encuentra en "/ mnt/sdcard/MYFOLDER" y la misma carpeta tiene un enlace simbólico en "/ sdcard/MYFOLDER" ..android: determinar un enlace simbólico

Mi pregunta es: "¿Hay alguna manera de determinar si el carpeta es un enlace simbólico o no? ". Por favor, dame algunas sugerencias ..

+0

nos puedes mostrar el código? –

+0

Puede consultar aquí: http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links. ¡Puede ser que te ayude! –

+0

Señor, no hay nada específico sobre el código ... Tengo una pregunta muy simple. escanea directorios usando la función listFiles(). Sin embargo, hay dos directorios con el mismo nombre, es decir,/mnt/scard y/sdcard. Uno es el enlace simbólico con el otro. Solo quiero saber si hay alguna manera de distinguir entre estos dos ... ¿Hay alguna manera de saber que la carpeta es un enlace simbólico? Muchas gracias – Farhan

Respuesta

13

Esta es esencialmente la forma en que lo hacen en Apache Commons (sujeto a their license):

public static boolean isSymlink(File file) throws IOException { 
    File canon; 
    if (file.getParent() == null) { 
    canon = file; 
    } else { 
    File canonDir = file.getParentFile().getCanonicalFile(); 
    canon = new File(canonDir, file.getName()); 
    } 
    return !canon.getCanonicalFile().equals(canon.getAbsoluteFile()); 
} 

Editar gracias a @LarsH comentario. El código anterior solo verifica si el archivo secundario es un enlace simbólico.

Con el fin de responder a la pregunta OP, es aún más fácil:

public static boolean containsSymlink(File file) { 
    return file.getCanonicalFile().equals(file.getAbsoluteFile()); 
} 
+0

Una respuesta útil, +1. ¿Alguna idea de por qué comprueban si hay un archivo principal y usan getCanonicalFile() de los padres en lugar de usar siempre canon = file? ¿Tiene que ver con "Si un elemento de ruta no existe (o no se puede buscar), hay un conflicto entre interpretar la canonicalización como una operación de texto (donde" a /../ b "es" b "incluso si" a " " no existe) ."? – LarsH

+1

Oh, entiendo ... esto es para determinar solo si el * último componente * en la ruta del 'archivo' es un enlace simbólico ... no si * cualquier componente * en la ruta del archivo es un enlace simbólico. Creo que en el caso del OP, querríamos lo último, en cuyo caso descartaríamos la cláusula 'else' de esta función. – LarsH

+1

@LarsH ¡Buen punto! He editado la respuesta. – rds

Cuestiones relacionadas