2011-02-09 3 views
5

유닉스 시스템에 마운트 된 윈도우 폴더에 파일을 쓰려고 할 때 게시물의 제목 오류가 발생합니다. 저는 Linux OS에서 Tomcat 6 내부에서 실행되는 웹 서비스를 개발했으며 Windows 네트워크 폴더에 작성해야합니다. 시스템 관리자는이를 Linux 서버에 마운트했으며 파일을 작성하고 수정할 수 있습니다. 나는 다음과 같은 예외가 얻을 게시 된 코드를 실행하려고 할 때 :java.io.IOException : 네트워크 폴더에 대한 사용 권한이 거부되었습니다.

권한이 거부 때 java.io.IOException : 권한이 java.io.File의에서 java.io.UnixFileSystem.createFileExclusively (기본 방법) 에서 거부를 .createNewFile (File.java:850)

이상한 점은 네트워크 폴더의 File.createNewFile 메소드와 관련이있는 것 같습니다. 실제로 서비스는 로컬 파일 시스템에 디버그와 함께 둘 다 쓸 수 있습니다 (PC를 서비스를 개발하는 데 사용) 및 tomcat 폴더 시스템 관리자는 리눅스 서버에 나를 제공했습니다. 파일은 작성되었지만 비어 있으며 create 메소드 다음의 로그 항목은 인쇄되지 않습니다. 게다가 내가 파일을 만들고 쓰는 데 평범한 outputstream을 사용하면 문제가 없다.

웹에서 예외에 대한 설명을 찾을 수 없습니다. 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)); 

는 대답

+0

은 리눅스에서 권한 문제와 비슷하게 들린다. chmod 해봤습니까? – dimitrisli

+0

시스템 관리자는 권한이 정상이라고 말하면서, 마운트 된 폴더에 파일을 만들고 vi로 수정할 수 있습니다. 내가 이해할 수없는 이유는 Fileoutputstream이 작동하는 동안 File 클래스 메서드가 실패하고 마운트 된 하나에서 실패 할 때 "locals folder"에서 작동하는 이유입니다. –

답변

3

최근에이 문제가 발생하여 java.io.File.createNewFile()에 실제로 "Change Permissions"권한이 필요하다는 것을 알았습니다. 폴더 권한을 확인할 때 Security-> Advanced에서이 항목을 찾을 수 있습니다. 이것이 없으면 파일을 생성 한 후 IOException을 던집니다.

수동으로 테스트 할 때 여전히 폴더에 파일을 만들 수 있기 때문에 사기성이 있습니다. 그러나 createNewFile()은이 특정 권한이없는 경우에도 실패합니다 (아마도 파일에 대한 사용 권한을 변경할 수있는 것과 같습니다) 그것의 창조).

+0

"권한 변경"권한이란 무엇입니까? (linux) chmod 폴더가 777로 설정되어 있어도 파일 생성 후 오류가 발생합니다. – likeachamp

+0

@likeachamp - "변경 권한"은 NTFS 파일/폴더 파마 (https://msdn.microsoft.com/en-us/library/bb727008.aspx)입니다. 리눅스에는 적용되지 않습니다. 이 질문은 탑재 된 Windows 폴더를 참조하므로 NTFS 사용 권한이 적용됩니다. –

2

그것은 확실히하지 자바 특정 문제에 미리 감사드립니다. 이 Unix 폴더가 윈도우에 매핑되어 있으면 파일 탐색기를 열어이 디렉토리에 파일을 만드십시오. 나는 당신도 허가를 거부 할 것이라고 믿습니다. 이런 경우이 문제를 해결하거나 시스템 관리자에게 도움을 요청하십시오.

행운을 빈다.

+0

공유 폴더 (\\ anetworkmachine \ myapp \ test)에/mntnfs/myapp/test /를 입력합니다. Windows 폴더에서 파일을 열고, 만들고, 수정할 수 있습니다. 마운트 된 폴더에 액세스하기위한 자격 증명을 모르겠 음 –

2

NTFS (CIFS) 스타일 파일 시스템을 Unix에 공유하는 Netapp를 사용하는 경우 "NFS가 NTFS 스타일 보안 볼륨의 파일에 대한 사용 권한을 변경할 수 없습니다."라는 경험이 될 수 있습니다. (TR-3490 16 페이지)

여기에있는 옵션은 유닉스 파일 시스템으로 변경하거나 cifs.ntfs_ignore_unix_security_ops 플래그를 NFS 권한 오류를 암호화하는 파일 시스템에 대해 설정합니다.정말하지 않습니다하는 NFS3RR_ACCES 또한

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

파일을 만들 수의 OutputStream을 사용할 수 있던하는 EACCES을 얻을 것입니다, 그래서

java.io.UnixFileSystem.createFileExclusively(Native Method)

는하여 O_EXCL와 파일 0666의 umask를 엽니 다 O_EXCL로 보임.