java.io.IOException: в сетевой папке отказано в разрешении - PullRequest
5 голосов
/ 09 февраля 2011

У меня ошибка заголовка поста при попытке записать файл в папку окна, смонтированную в системе Unix.Я разработал веб-сервис, который работает внутри Tomcat 6 на ОС Linux и должен писать в сетевой папке Windows.Системные администраторы смонтировали его на сервере Linux и не имеют проблем с созданием и изменением файла на нем.Когда я пытаюсь выполнить опубликованный код, я получаю следующее исключение:

Разрешение отклонено(File.java:850)

Странно то, что он, похоже, связан с методом File.createNewFile в сетевой папке, фактически служба может без проблем записывать данные в локальную файловую систему, как при отладке.(компьютер, который я использую для разработки сервиса) и системные администраторы папок tomcat предоставили мне сервер Linux.Файл создается, но он пуст, и запись журнала, следующая за методом создания, не печатается.Более того, если я использую простой выходной поток для создания и записи файла, у меня нет проблем.

Я не могу найти какое-либо объяснение об исключении в Интернете.Так как я не очень опытен с Java, я хотел бы понять, почему я получаю эту ошибку.Я использую это неправильно?Это ошибка библиотеки?Я скучаю, чтобы передать какой-то параметр?Как уже говорилось, я решил проблему с помощью простого выходного потока, это вопрос для улучшения моего понимания 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)); 

Заранее спасибо за любой ответ

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Недавно я столкнулся с этой проблемой и обнаружил, что java.io.File.createNewFile () действительно требует разрешения «Изменить разрешения» (эту запись можно найти в разделе «Безопасность» -> «Дополнительно» при проверке разрешений для папок). Без этого он создаст файл и затем выдаст исключение IOException.

Это обманчиво, потому что вы все равно сможете создавать файлы в папке при ручном тестировании, однако createNewFile () все равно не будет работать, если у него нет этого конкретного разрешения (предположительно, такого, что он может изменить разрешения для файла, его создание).

3 голосов
/ 10 сентября 2013

Если вы используете Netapp, который использует файловую систему в стиле NTFS (CIFS) для Unix, у вас может возникнуть впечатление: «NFS не разрешено изменять разрешения для файла на томе безопасности в стиле NTFS».( TR-3490 стр. 16)

Здесь можно изменить файловую систему Unix или установить флаг cifs.ntfs_ignore_unix_security_ops для файловой системы, которая отключаетОшибка разрешения NFS.

java.io.UnixFileSystem.createFileExclusively(Native Method) открывает файл с O_EXCL и 0666 umask, поэтому я получу EACCES , который действительно был NFS3RR_ACCES

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

Также вы можете использовать OutputStream для создания файла, который не использует O_EXCL, который он видит

2 голосов
/ 09 февраля 2011

Это определенно не специфичная для Java проблема.Если эта папка Unix сопоставлена ​​с вашими окнами, попробуйте открыть проводник и создать файл в этом каталоге.Я верю, что вам также будет отказано в разрешении.В этом случае решите эту проблему или попросите вашего системного администратора помочь вам.

Удачи!

...