web-dev-qa-db-ja.com

フォルダーに書き込もうとしたときに「Java.nio.file.AccessDeniedException」を取得する

何らかの理由で、TomcatでJava webappを使用してコンピューター上のフォルダーに書き込むたびにJava.nio.file.AccessDeniedExceptionを取得し続けます。このフォルダーには、コンピューター上のすべてのユーザーのフルコントロールに設定されたアクセス許可があります(Windows)。この例外が発生する理由を誰か知っていますか?

私のコードは次のとおりです。

public void saveDocument(String name, String siteID, byte doc[]) {
    try {
        Path path = Paths.get(rootDirectory + siteID);
        if (Files.exists(path)) {
            System.out.println("Exists: " + path.toString());
            Files.write(path, doc);
        } else {
            System.out.println("DOesn't exist");
            throw new Exception("Directory for Site with ID " + siteID + "doesn't exist");
        }
    } catch (FileSystemException e) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    } catch (IOException e ) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    }

そして、ここにエラーがあります:

例外:Java.nio.file.AccessDeniedException:C:\ safesite_documents\site1 Java.nio.file.AccessDeniedException:C:\ safesite_documents\site1 at Sun.nio.fs.WindowsException.translateToIOException(WindowsException.Java:83)at Sun. JavaでSun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.Java:102)でSun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.Java:230)でnio.fs.WindowsException.rethrowAsIOException(WindowsException.Java:97) .nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.Java:430)at Java.nio.file.Files.newOutputStream(Files.Java:172)at Java.nio.file.Files.write(Files.Java:3092 )

考えられる理由: Windows 7のフォルダーの「読み取り専用」をオフにできない方法については、スーパーユーザーの投稿を参照してください。ただし、Java

48
OneTwo

わかりました、私は何か愚かなことをしていたことがわかりました。新しいファイル名をパスに追加していませんでした。

持っていた

rootDirectory = "C:\\safesite_documents"

しかし、それはあったはずです

rootDirectory = "C:\\safesite_documents\\newFile.jpg" 

いつものように、それは愚かな間違いでした。

70
OneTwo

この質問に対する答えではありません

ファイルを削除したフォルダーを削除しようとしたときにこの例外が発生しました。

例:

createFolder("folder");  
createFile("folder/file");  
deleteFile("folder/file");  
deleteFolder("folder"); // error here

deleteFile("folder/file");は削除されたことを返しましたが、フォルダーはプログラムの再起動後にのみ空と見なされます。

一部のオペレーティングシステムでは、このJava仮想マシンまたは他のプログラムで開いて使用中のファイルを削除できない場合があります。

https://docs.Oracle.com/javase/8/docs/api/Java/nio/file/Files.html#delete-Java.nio.file.Path-

dhkeからの説明

1
thiagola92

ファイルをコピーしようとしたときに同じエラーが表示されました。ターゲットファイルに関連付けられているチャネルを閉じると、問題は解決しました。

Path destFile = Paths.get("dest file");
SeekableByteChannel destFileChannel = Files.newByteChannel(destFile);
//...
destFileChannel.close();  //removing this will throw Java.nio.file.AccessDeniedException:
Files.copy(Paths.get("source file"), destFile);

.Androidフォルダーのキャッシュファイルを削除します。また、ビルドフォルダーをディレクトリから手動で削除し、Android studioを開いて再実行します。

enter image description here

1
vinod