2009-08-13 13 views
26

Mi pequeña aplicación de utilidad le pide al usuario un directorio de salida a través de un selector de archivo GUI. Luego crea una gran cantidad de archivos en este directorio de salida después de algún procesamiento.Verificar el acceso de escritura en un directorio antes de crear archivos dentro de él

tengo que comprobar si la aplicación tiene acceso de escritura para que se informa al usuario y no no continuar con el tratamiento (que puede llevar mucho tiempo)

Mi primer intento fue el CanWrite() método de java.io.File. Pero esto no funciona ya que se trata de la entrada del directorio en sí y no de su contenido. He visto al menos una instancia de una carpeta de Windows XP que puede renombrarse o eliminarse, pero no se pueden crear archivos en ella (debido a los permisos). Este es en realidad mi caso de prueba.

finalmente se establecieron con la siguiente solución

//User places the input file in a directory and selects it from the GUI 
//All output files will be created in the directory that contains the input file 
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser 
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try 
{ 
    /* 
     * Create and delete a dummy file in order to check file permissions. Maybe 
     * there is a safer way for this check. 
     */ 
     sample.createNewFile(); 
     sample.delete(); 
} 
catch(IOException e) 
{ 
     //Error message shown to user. Operation is aborted 
} 

Sin embargo esto no se siente elegante para mí ya que sólo trata de crear realmente un archivo y comprueba si la operación tiene éxito.

Sospecho que debe haber una mejor manera para esto, pero todas las soluciones que he encontrado hasta el momento con los administradores de seguridad y otras cosas se refieren a los applets de Java y no a las aplicaciones independientes. ¿Me estoy perdiendo algo?

¿Cuál es la forma recomendada de verificar el acceso a archivos dentro de un directorio antes de realmente escribir los archivos?

estoy usando Java 5.

+0

¿Qué pasa si "empty.txt" ya existe? Luego terminas borrando un archivo que puede haber sido importante. –

+0

Sí, sería mejor si se usara el booleano devuelto por createNewFile() para entender si el archivo realmente se creó de no. – kazanaki

Respuesta

19

Usted puede comprobar los permisos de archivo, asegúrese de que el directorio existe, y hacer un montón de cheques o de encontrar una biblioteca que hace todo lo que la comprobación de usted PERO (!) ¿No es la mejor manera de verificar para probar? Si comprueba los permisos y el sistema de archivos cambia ... tendrá que cambiar su código. Pero intentar escribir un archivo SIEMPRE te dirá si puedes escribir un archivo.

Su solución no tiene por qué ser la más elegante. No es un parche barato codificado o algo feo. Es solo código normal. Y siempre funcionará. Pero si no le gusta ver ese cheque en el código, simplemente sepárelo poniéndolo en clase, cuyo único objetivo es verificar la posibilidad de escritura. De hecho, debes ponerlo en una clase de utilidad si te gusta la elegancia o no.

La otra solución sería colocar todo su código de escritura en el disco duro, en el intento. Y si no puede escribir, se saltará toda la parte y dará sus comentarios al usuario con un mensaje en la parte de captura.

0

no funciona incluso si se invoca canWrite en la última ruta ?

File sample = new File(fileBrowse.getParent(),"empty.txt"); 

if (sample.canWrite()) { 
    doSomethingUseful(sample); 
} else { 
    notifyUser(); 
} 
+4

No lo hace porque el canWrite también verifica si el archivo existe. Este no es el caso con tu código. Se menciona en el javadoc. – kazanaki

0

puede utilizar FilePermission para obtener los detalles. Me parece una manera en que es necesario implementar SecurityManager el código es here y here

+0

Miré FilePermission pero me parece que se usa en Applets para otorgar acceso a los archivos. ¿Tienes un ejemplo con aplicaciones independientes? – kazanaki

0

Diría que concéntrese en proporcionar una buena experiencia de usuario si/cuando el archivo no se puede escribir, y simplemente no se moleste en verificar previamente la ruta.Dado que dices que el procesamiento requiere una tomografía, no hay forma de garantizar que aún puedas escribir en esa ruta cuando termine. Los permisos podrían variar entre la fecha en que realiza la verificación y cuando escribe, o el disco podría llenarse, o ...

0

Usando Java 1.8 pude usar lo siguiente.

Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(Paths.get(destDir), LinkOption.NOFOLLOW_LINKS); 
Assert.assertTrue("User did not have read permission.", permissions.contains(PosixFilePermission.OWNER_READ)); 
Assert.assertTrue("User did not have execute permission.", permissions.contains(PosixFilePermission.OWNER_EXECUTE)); 
Assert.assertTrue("User did not have write permission.", permissions.contains(PosixFilePermission.OWNER_WRITE)); 

Assert.assertFalse("Group did have read permission.", permissions.contains(PosixFilePermission.GROUP_READ)); 
Assert.assertFalse("Group did have execute permission.", permissions.contains(PosixFilePermission.GROUP_EXECUTE)); 
Assert.assertFalse("Group did have write permission.", permissions.contains(PosixFilePermission.GROUP_WRITE)); 

Assert.assertFalse("Others did have read permission.", permissions.contains(PosixFilePermission.OTHERS_READ)); 
Assert.assertFalse("Others did have execute permission.", permissions.contains(PosixFilePermission.OTHERS_EXECUTE)); 
Assert.assertFalse("Others did have write permission.", permissions.contains(PosixFilePermission.OTHERS_WRITE)); 
Cuestiones relacionadas