2011-11-03 8 views
6

Código:¿Hay una forma adecuada de verificar la existencia de archivos/directorios en Java?

String dir = //Path to the directory 
File saveDir = new File(dir); 
//Here comes the existence check 
if(!saveDir.exists()) 
    saveDir.mkdirs(); 

Esta parte del código se utiliza para guardar archivos con una ruta de directorio dado al sistema de archivos. Antes de guardar, quiero verificar si existe el directorio de guardar proporcionado. Sin embargo, el control de existencia no parece funcionar de la manera que yo quería. Sin eliminar la cláusula if, no se crean los directorios deseados. Me encontré con esta interesante pregunta de pila mientras buscaba mi problema. Alternative to File.exists() in Java. Como yo entiendo java.io tiene este problema.

¿Existe una manera adecuada y segura de verificar la existencia de un directorio o recurso mientras se realizan operaciones de archivos?

+0

Poco relacionado, pero siempre y cuando tenga cuidado, probablemente también debería comprobar 'isDirectory()'. – Kevin

Respuesta

6

Bueno, incluso si el cheque sería correcto, nunca se puede estar seguro de que todavía existe el directorio después la if condición ha sido evaluado. Otro proceso o usuario puede simplemente crearlo/eliminarlo. Entonces, debe verificar si la operación falla (posiblemente atrapando la excepción apropiada) de todos modos.

Así que no debe confiar en los cheques y esperar el peor de los casos siempre. (Bueno, los controles pueden ser útil para prevenir que haga algo innecesario, o para pedir la confirmación del usuario etc, pero no lo hacen garantía de nada.)

+0

Gracias por la respuesta. El resto del código inicia la operación de guardar archivos con flujo de entrada y salida, por lo tanto, es necesario para manejar o lanzar IOException. Pero aún así no quiero que mi código intente llamar a un método de creación de directorios para uno existente. – fgakk

+0

@fga: bueno, si el directorio aparece/desaparece repentinamente, de todos modos, algo va mal. Su código debe comportarse correctamente y no debe arrojarse si todo sale bien, pero debe procesar la excepción para el caso cuando algo suceda. Así que está bien comprobar si el directorio existe, porque funcionaría en el flujo de trabajo normal. Pero como este control no es confiable, no puede decir que no puede decir que la excepción no se lanzará. – Vlad

27
new File(dir).getCanonicalFile().isDirectory(); 

esqueleto para su referencia: -

File f = new File("...."); 
if (!f.exists()) { 
    // The directory does not exist. 
    ... 
} else if (!f.isDirectory()) { 
    // It is not a directory (i.e. it is a file). 
    ... 
} 
+4

Otro ejemplo más de la respuesta con más votos útiles, en lugar de la respuesta aceptada. – Amala

0

FileChannel.lock() hace precisamente lo que quiere, siempre y cuando no es otro hilo en la JVM que está borrando el directorio mientras está usando. Esto exige un bloqueo del sistema operativo en un archivo/carpeta en nombre del proceso de JVM, por lo que mientras que otros procesos no podrán acceder a ese directorio, los hilos en la JVM puede.

1

Simplemente haga la llamada al mkdirs. No sobrescribirá los directorios existentes, de modo que su cheque es innecesario (y, en cualquier caso, no confiable).

Cuestiones relacionadas