Java: compruebe si existe un archivo o directorio

    Introducci贸n

    Verificar si existe un archivo o directorio es una operaci贸n simple e importante en muchas tareas. Antes de acceder a un archivo, debemos comprobar si existe para evitar una NullPointerException. Lo mismo ocurre con los directorios.

    Si bien algunas funciones pueden crear un nuevo archivo / directorio si el solicitado no existe, esto puede ser lo contrario de lo que queremos. Si deseamos agregar m谩s informaci贸n a un archivo existente y el m茅todo se ejecuta sin una advertencia, ya que crea el nuevo archivo que necesita, es posible que hayamos perdido algo de informaci贸n sin darnos cuenta.

    Aqu铆, tenemos una estructura simple:

    02/13/2020  11:53 AM    <DIR>          directory
    02/13/2020  11:55 AM    <SYMLINKD>     directory_link [directory]
    02/13/2020  11:53 AM                 0 file.txt
    02/13/2020  11:55 AM    <SYMLINK>      symlink.txt [file.txt]
    

    Hay una file.txt archivo y un symlink.txt archivo. los symlink.txt archivo es un enlace simb贸lico al file.txt.

    Del mismo modo, tenemos un directory y un enlace simb贸lico a 茅l – directory_link.

    Compruebe si existe un archivo

    Para trabajar con el Files clase, necesitas estar familiarizado con la Path clase. Files solo acepta Path, y no File objetos.

    Para los prop贸sitos del tutorial, definiremos un File y Path instancia para el file.txt en nuestro directorio:

    final static String location = "C:\file.txt";
    
    Path path = Paths.get(location);
    File file = new File(location);
    

    Archivos.existe ()

    Dicho esto, la primera forma en que podemos verificar si existe un archivo es a trav茅s del Files clase:

    // Check if file exists through a Path
    System.out.println(Files.exists(path));
    
    // Check if a file exists by converting File object to Path
    System.out.println(Files.exists(file.toPath()));
    

    Ejecutar este c贸digo nos dar谩:

    true
    true
    

    Files.notExists ()

    Quiz谩s se pregunte por qu茅 notExists() el m茅todo existe en absoluto:

    Si exists() devoluciones true, Eso significa que notExists() deber铆a volver false. Son plugins l贸gicos y A = !B, 驴derecho?

    Bueno, ah铆 es donde muchos se equivocan. Si Files.exists() devoluciones false, eso no tiene que significar que el archivo no existe.

    Tambi茅n puede significar que la existencia del archivo no se puede verificar. En ese caso, ambos Files.exists() y Files.notExists() volver铆a false, ya que Java no puede determinar si el archivo existe o no.

    Esto suele ocurrir si tiene un archivo que est谩 bloqueado de una manera que Java no puede acceder a 茅l. Imagina que tuvi茅ramos un archivo que est谩 bloqueado en nuestro directorio. lockedFile.txt:

    Y si intent谩ramos verificar su existencia con:

    System.out.println(Files.exists(path));
    System.out.println(Files.notExists(path));
    

    Ser铆amos recibidos con:

    false
    false
    

    Existe, obviamente, pero Java no tiene permiso para confirmarlo en nuestro sistema, lo que da resultados contradictorios.

    Files.isRegularFile ()

    Adem谩s, podemos comprobar si el archivo es un archivo normal (false si es un directorio) a trav茅s del isRegularFile() m茅todo:

    System.out.println(Files.isRegularFile(path));
    

    La salida es:

    true
    

    File.isFile ()

    En lugar de utilizar el Files class, tambi茅n podemos realizar m茅todos en los propios objetos de archivo:

    System.out.println(file.isFile());
    

    Esto devuelve:

    true
    

    El archivo existe()

    Similar a la opci贸n anterior, podemos ejecutar el exists() m茅todo:

    System.out.println(file.exists());
    

    Y esto tambi茅n vuelve:

    true
    

    La diferencia entre estos dos es que el primero verifica si es un archivo y el otro verifica si existe. En diferentes circunstancias, arrojar铆an resultados diferentes.

    Archivos bloqueados

    Algo divertido de tener en cuenta es que si est谩 utilizando un File para verificar la existencia, Java puede determinar si el archivo bloqueado de antes existe o no:

    System.out.println(file.isFile());
    System.out.println(file.exists());
    

    Ejecutar este fragmento de c贸digo producir谩:

    true
    true
    

    Con esto, es evidente que el archivo bloqueado se puede leer utilizando el File clase en lugar de la Files clase de ayudante.

    Compruebe si existe un directorio

    Los directorios son esencialmente archivos que pueden contener otros archivos. Es por eso que comprobar si un directorio es un archivo devolver谩 true. Sin embargo, si est谩 comprobando si un directorio es un directorio (un tipo especial de archivo), obtendr谩 un resultado m谩s preciso.

    Esta vez, cambiaremos nuestra ubicaci贸n a:

    final static String location = "C:\directory";
    

    Archivos.existe ()

    Nuevamente, al igual que en el primer ejemplo, podemos verificar si existe a trav茅s de:

    System.out.println(Files.exists(path));
    

    La salida es:

    true
    

    Files.isDirectory ()

    Si quisi茅ramos verificar si es espec铆ficamente un directorio, usar铆amos:

    System.out.println(Files.isDirectory(path));
    

    Y la salida es:

    true
    

    Nota: Si el directorio no existe, la isDirectory() el m茅todo regresar谩 false. Se debe a la forma en que se nombra el m茅todo. Lo que hace es: comprueba si el archivo existe y si es un directorio, no solo este 煤ltimo. Un archivo no puede ser un directorio si no existe, por lo tanto, false es regresado.

    Tambi茅n puede comprobar si un archivo es solo un enlace simb贸lico. En ese caso, usar铆a el Files clase.

    Cambiemos nuestra ubicaci贸n a:

    final static String location = "C:\symlink.txt";
    

    Como de costumbre, el Files la clase acepta un Path al archivo:

    System.out.println(Files.isSymbolicLink(path));
    

    Ejecutar esto producir铆a:

    true
    

    File.getCanonicalPath () frente a File.getAbsolutePath ()

    Otra forma de verificar un enlace simb贸lico es comparar los resultados de la ruta can贸nica y la ruta absoluta del archivo. Si son diferentes, lo m谩s probable es que sea un enlace simb贸lico:

    System.out.println(file.getCanonicalPath());
    System.out.println(file.getAbsolutePath());
    

    Como estamos buscando un enlace simb贸lico y sabemos que lo es, estos deber铆an devolver un resultado diferente: un symlink.txt y file.txt camino:

    C:symlink.txt
    C:symlink.txt
    

    Sin embargo, este no es el caso aqu铆. Esto se debe al hecho de que el enlace simb贸lico se cre贸 en Windows con NTFS (New Technology File System). El enlace simb贸lico se cre贸 utilizando el mklink comando en el CMD.

    Compruebe si existe alguno

    De los ejemplos anteriores, es evidente que el Files.exists() el m茅todo regresar谩 true para archivos y directorios existentes. Sin embargo, no funciona mejor cuando se trata de archivos bloqueados.

    Por otro lado, el exists() m茅todo del File la clase tambi茅n volver谩 true para archivos y directorios y puede leer el archivo bloqueado que el Files la clase no puede.

    Conclusi贸n

    Verificar la existencia de archivos y directorios es la primera l铆nea de defensa contra archivos y directorios faltantes. Los diferentes enfoques tienen diferentes contratiempos y puede suponer que un m茅todo devolver谩 un resultado preciso, pero no lo har谩 debido a c贸mo funciona en segundo plano.

    Ser consciente de qu茅 m茅todos devuelven qu茅 resultados y qu茅 circunstancias le permitir谩 evitar desagradables excepciones al manejar archivos.

    Despu茅s de verificar si su archivo existe o no, es probable que desee leer y escribir archivos en Java.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *