En ocasiones al trabajar con ficheros en una aplicación, es necesario saber si son enlaces simbólicos o ficheros "estándar" Por ello, hoy vamos a ver un conjunto de métodos que nos facilitarán la vida a la hora de trabajar con enlaces simbólicos en Java.

Saber si un fichero es enlace simbólico

Comenzamos con el código de un método encargado de conocer si un fichero es un enlace simbólico.

/**
 * Obtiene un valor booleano que indica si el fichero recibido es un enlace
 * simbólico.
 * @param  file  Fichero a analizar.
 * @return Valor booleano que indica si el fichero recibido es un enlace
 *         simbólico.
 * @throws IOException  Lanzada cuando no se puede acceder al fichero.
 * @throws NullPointerException  Si el valor recibido es nulo.
 */
public static boolean isSymLink(final File file)
                               throws IOException, NullPointerException {
  File canonical;

  if (file.getParent() == null) {
    canonical = file;
  } else {
    File canonDir = file.getParentFile().getCanonicalFile();
    canonical = new File(canonDir, file.getName());
  }

  return !canonical.getCanonicalFile().equals(canonical.getAbsoluteFile()); 
}

En el código anterior lo único que hacemos es comprobar si el fichero "real" que estamos manejando es el mismo fichero al que apuntamos. Nada más sencillo.

Conocer el destino del enlace

Ahora pasemos a ver el segundo método que nos dará el fichero o directorio al que apunta un enlace simbólico:

/**
 * Obtiene una cadena que indica el destino de un enlace simbólico.
 * @param  file  Nombre del fichero a analizar.
 * @return Cadena con el destino de un enlace simbólico o <b>null</b> si el
 *         fichero no es un enlace o hubo un problema en la lectura del
 *         fichero.
 * @throws IOException  Lanzada cuando no se puede acceder al fichero.
 * @throws NullPointerException  Si el valor recibido es nulo.
 */
public static String getSymDestination(final File file)
                                      throws NullPointerException, IOException {
  String destination = null;

  if (isSymLink(file)) {
    File canonical;
	
    if (file.getParent() == null) {
      canonical = file;
    } else {
      final File canonDir = file.getParentFile().getCanonicalFile();
      canonical = new File(canonDir, file.getName());
    }
	
    destination = canonical.getCanonicalFile().getCanonicalPath();
  }

  return destination;
}

Aquí, como se ha observado ver lo que se hace es parecido al primer método, pero en este caso se devuelve la ruta canónica, es decir, la ruta real del fichero apuntado.

Como extra, los dos métodos anteriores, se pueden completar con otros dos homónimos para tener sobrecarga de operadores:

public static boolean isSymLink(final String file)
                               throws NullPointerException, IOException {
  return isSymLink(new File(file));
}

public static String getSymDestination(final String file)
                                      throws NullPointerException, IOException {
  return getSymDestination(new File(file));
}

Trabajando con los dos métodos vistos en este artículo, por un lado de podrá conocer si un fichero es un enlace simbólico con el método isSymLink, en cuyo caso se puede conocer el destino del enlace con getSymDistination.

Comparte este artículo con quien quieras
C/C++: Texto de consola con formato
Problemas de secuencias PostgreSQL con Hibernate

Leave a Comment

Your email address will not be published. Required fields are marked *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.