2011-02-09 94 views
5

UNIXシステムにマウントされたウィンドウフォルダにファイルを書き込もうとすると、投稿のタイトルエラーが発生します。私はLinux OS上でTomcat 6の中で動作し、Windowsネットワークフォルダに書き込む必要のあるWebサービスを開発しました。システム管理者は、Linuxサーバーにファイルシステムをマウントしており、ファイルの作成と変更に問題はありません。 私は投稿のコードを実行しようとすると、私は次の例外を取得:java.io.IOException:ネットワークフォルダのアクセスが拒否されました

許可が にjava.io.IOExceptionを拒否:アクセス許可がjava.io.Fileのでjava.io.UnixFileSystem.createFileExclusively(ネイティブメソッド) で を否定.createNewFile(File.java:850)

奇妙なことは、ネットワークフォルダー上のFile.createNewFileメソッドに関連しているようですが、実際にはサービスはローカルファイルシステム上でデバッグ時にも問題なく書き込むことができます(私はPCのサービスを開発するために使用する)とTomcatのフォルダシステム管理者は、Linuxサーバー上で私を提供しています。ファイルは作成されますが空ですが、createメソッドに続くログエントリは出力されません。さらに、ファイルを作成して書き込むためにプレーンな出力ストリームを使用しても問題はありません。

ウェブ上で例外に関する説明が見つかりません。私は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)); 

はどんな答え

+0

は、Linuxボックスで許可の問題のように聞こえます。あなたはchmodを試しましたか? – dimitrisli

+0

システム管理者によると、権限はOKです。彼はマウントされたフォルダにファイルを作成し、viで修正することができます。私が理解できないのは、fileoutputstreamの動作中にFileクラスメソッドが失敗し、マウントされたファイルに失敗したときに "locals folder"で動作する理由です。 –

答えて

3

最近、この問題が発生し、java.io.File.createNewFile()は実際には "アクセス権の変更"アクセス許可が必要であることがわかりました。これがなければ、ファイルが作成され、その後にIOExceptionがスローされます。

手作業でテストするときにフォルダにファイルを作成することはできますが、createNewFile()はこの特定のアクセス許可を持っていないと失敗します(恐らくファイルのアクセス権を変更できるようになりますその作成)。

+0

「アクセス権の変更」アクセス権とはどういう意味ですか? (linux)chmodが777に設定されていても、ファイルが生成された後にそのエラーがスローされます。 – likeachamp

+0

@ likeachamp - "変更権限"は、NTFSファイル/フォルダパーマネント(https://msdn.microsoft.com/en-us/library/bb727008.aspx)です。これはLinuxには当てはまりません。この質問は、マウントされたWindowsフォルダを参照しているため、NTFSのアクセス許可が有効になります。 –

2

それは間違いではないJavaの特定の問題のために、事前にあなたに感謝します。このUnixフォルダがあなたのウィンドウにマップされている場合は、ファイルエクスプローラを開き、このディレクトリにファイルを作成してみてください。私はあなたが許可も拒否されると信じています。この場合、この問題を解決するか、システム管理者に相談してください。

幸運を祈る!

+0

共有フォルダ(\\ anetworkmachine \ myapp \ test) mntnfs/myapp/test /を実行します。私は、Windowsフォルダ上のファイルを開き、作成し、変更することができます。マウントされたフォルダにアクセスするための資格情報を知らない –

2

NTFS(CIFS)スタイルのファイルシステムをUnixに共有するNetAppを使用している場合、「NFSはNTFS形式のセキュリティボリューム内のファイルに対するアクセス許可を変更することはできません。 (TR-3490 16ページ)

ここでのオプションは、NFS許可エラーを消すファイルシステムのUNIXファイルシステムに変更するか、cifs.ntfs_ignore_unix_security_opsフラグをオンに設定することです。私は本当に

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

NFS3RR_ACCESはまた、あなたにはないファイルを作成するのOutputStreamを使用することができたEACCESを、なるだろうので

java.io.UnixFileSystem.createFileExclusively(Native Method)はO_EXCLおよび0666のumaskでファイルを開きますO_EXCLを使用してください。

関連する問題