2011-02-09 43 views
5

Tengo el error de título de la publicación cuando intento escribir un archivo en una carpeta de ventana, montado en el sistema Unix. Desarrollé un servicio web que se ejecuta dentro de un Tomcat 6 en un sistema operativo Linux y necesito escribir en una carpeta de red de Windows. Los administradores del sistema lo han montado en el servidor Linux y no tienen problemas para crear y modificar un archivo en él. Cuando trato de ejecutar el código publicado consigo la siguiente excepción:java.io.IOException: Permiso denegado en la carpeta de red

ha denegado el permiso java.io.IOException: Permiso denegado en java.io.UnixFileSystem.createFileExclusively (Nativo Método) en java.io.File .createNewFile (File.java:850)

Lo raro es que parece estar relacionado con el método File.createNewFile en una carpeta de red, de hecho el servicio puede escribir en el sistema de archivos local sin problemas, ambos en depuración (la pc que uso para desarrollar el servicio) y una carpeta de tomcat que los administradores del sistema me proporcionaron en el servidor de Linux. El archivo se crea pero está vacío y la entrada de registro que sigue al método de creación no se imprime. Además, si uso una salida de salida simple para crear y escribir el archivo, no tengo problemas.

No encuentro ninguna explicación sobre la excepción en la web. Como no tengo mucha experiencia con Java, me gustaría entender por qué me aparece este error. ¿Lo estoy usando de la manera incorrecta? ¿Es un error de la biblioteca? ¿Extraño pasar algún parámetro? Como dije, he resuelto el problema usando una salida de salida simple, esta es una pregunta para mejorar mi comprensión de Java.

FileOutputStream fos = null; 
try{ 

    log.info(String.format("file length: %s",streamAttach.length)); 
    log.info(String.format("check File : %s",filename)); 
    File f = new File(filename); 
    if(f.exists()) 
    ...       

    boolean done= f.createNewFile();//here comes the exception 
    //nothing of the following happens 
    if(!done) 
     throw new NWSException("error creating file"); 
    log.info(String.format("file %s creato", nomeFile)); 

gracias de antemano por cualquier respuesta

+0

suena como un problema de permisos en el cuadro de Linux. ¿Has probado chmod? – dimitrisli

+0

administrador del sistema dice que los permisos son correctos, puede crear un archivo en la carpeta montada y modificarlo con vi. Lo que no puedo entender es por qué el método de clase File falla mientras el archivooutputstream funciona y por qué funciona en "carpeta local" mientras falla en el montado –

Respuesta

3

Me encontré con este problema recientemente y descubrí que java.io.File.createNewFile() en realidad requiere el permiso "Cambiar permisos" (puede encontrar esta entrada en Seguridad-> Avanzado al verificar los permisos de la carpeta). Sin esto creará el archivo y luego lanzará una IOException.

Es engañoso porque aún podrá crear archivos en la carpeta cuando realice pruebas manualmente, sin embargo, crearNewFile() seguirá fallando si no tiene este permiso en particular (presumiblemente tal que puede cambiar los permisos en el archivo su creación).

+0

¿qué quiere decir con permiso de "permiso de cambio"? (linux) incluso si la carpeta chmod está configurada en 777, ese error se produce después de que se genera el archivo. – likeachamp

+0

@likeachamp - "permiso de cambio" es una permutación de archivo/carpeta NTFS (https://msdn.microsoft.com/en-us/library/bb727008.aspx). No se aplica a Linux. Esta pregunta se refería a una carpeta montada de Windows, por lo que los permisos NTFS entran en juego. –

2

Definitivamente no Java problema específico. Si esta carpeta de Unix está mapeada en su ventana, intente abrir el explorador de archivos y crear un archivo en este directorio. Creo que también obtendrás permiso denegado. En este caso, solucione este problema o solicite ayuda al administrador de su sistema.

¡Buena suerte!

+0

está en una carpeta compartida (\\ anetworkmachine \ myapp \ test) montado como/mntnfs/myapp/test/en el servidor de Linux. Puedo abrir, crear y modificar archivos en la carpeta de Windows. No sé las credenciales para acceder a la carpeta montada –

2

Si está utilizando Netapp que comparte un sistema de archivos de estilo NTFS (CIFS) con Unix, podría experimentar: "NFS no tiene permiso para cambiar permisos en un archivo en un volumen de seguridad de estilo NTFS". (TR-3490 página 16)

Las opciones aquí son cambiar a un sistema de archivos unix o configurar el indicador cifs.ntfs_ignore_unix_security_ops en el sistema de archivos que quita el error de permiso NFS.

java.io.UnixFileSystem.createFileExclusively(Native Method) abre el archivo con el O_EXCL y 0666 umask por lo que se pueden conseguir una EACCES, que en realidad era un NFS3RR_ACCES

open("/net/storage01-a/filer/myfile", O_RDWR|O_CREAT|O_EXCL, 0666) Err#13 EACCES 

También puede utilizar OutputStream para crear el archivo, que no lo hace use O_EXCL que parece