2011-06-03 165 views
22

Me gustaría un fragmento de código que compruebe si un directorio tiene permisos de lectura/escritura y hacer algo si lo hace, y hace algo más si no lo hace. Probé un ejemplo que se muestra aquí:¿Cómo comprobar los permisos de escritura de un directorio en java?

try { 
    AccessController.checkPermission(new FilePermission("/tmp/*", "read,write")); 
System.out.println("Good"); 
    // Has permission 
} catch (SecurityException e) { 
    // Does not have permission 
System.out.println("Bad"); 
} 

El problema es la excepción siempre se activa, por lo que siempre termina la impresión de "malo" con independencia de que el directorio tiene permisos de escritura o no. (Modifiqué los directorios a 777 o 000 para probar).

¿Existe alguna alternativa o alguna forma de lograr lo que necesito?

Respuesta

21

si sólo quiere comprobar si se puede escribir:

File f = new File("path"); 
if(f.canWrite()) { 
    // write access 
} else { 
    // no write access 
} 

para el control de acceso de lectura, hay una función canRead()

+0

f.canWrite falla en la ruta de red, por ejemplo: - "\\ abc123 \ canwrite". Si no tengo el permiso para escribir en este directorio, no me devuelve el valor correcto. – amod

9

Se debe utilizar la ruta del directorio solo ("/tmp") para consultar los permisos de un directorio:

AccessController.checkPermission(new FilePermission("/tmp", "read,write")); 

Con "/tmp/*" consultar los permisos de todos los archivos dentro de la /tmp directorio.

0

¿Desea verificar los permisos de la carpeta o en la carpeta?

"/ *" en el nombre de ruta significa un directorio y todos los archivos contenidos en ese directorio.

see javadoc

4

Java tiene su propio modelo de permisos que gira en torno al uso de las clases AccessController y Permission. Los permisos se otorgan a un código fuente (la ubicación desde donde se cargan las clases), y en algunos/la mayoría de los casos estos permisos son diferentes de los permisos subyacentes necesarios para acceder al recurso deseado.

Por ejemplo, aunque puede haber otorgado a todos los usuarios la capacidad de leer y escribir en el directorio /tmp, esto no es suficiente para que AccessController otorgue a su código el permiso necesario. También necesitará agregar una regla en el archivo de política utilizado (por el AccessController) para leer y escribir archivos del directorio/tmp. La regla se cree será equivalente a la siguiente:

grant codeBase "<location of the codebase>" { 
    permission java.io.FilePermission "/tmp/-", "read, write"; 
}; 
17

En Java lo hago de esta manera:

if(Files.isWritable(path)){ 
    //ok, write 
} 

Docs

+3

El documento solo menciona archivos. ¿Funciona para directorios?¿Funciona en rutas de red? – Zzirconium

+0

El argumento es una 'Ruta' por lo que no debería importar si es un Archivo o Directorio. –

0

Esto parece funcionar bien:

assertFalse(Files.isWritable(new File("/etc/").toPath())); 
assertTrue(Files.isWritable(new File("/tmp/").toPath())); 
Cuestiones relacionadas