获取" java.nio.file.AccessDeniedException"当试图写入文件夹时

时间:2015-02-23 09:32:26

标签: java file-io io access-denied

出于某种原因,每次我尝试使用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.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)       at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)       at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)       在java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:430)       at java.nio.file.Files.newOutputStream(Files.java:172)       在java.nio.file.Files.write(Files.java:3092)

可能原因:See my post on supersuser about how I can't uncheck 'Read Only' for any of my folders on windows 7. Even though all the folders aren't read only to anything but java.

5 个答案:

答案 0 :(得分:66)

好吧事实证明我做的事情很愚蠢。我没有将新文件名添加到路径中。

我有

rootDirectory = "C:\\safesite_documents"

但应该是

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

对不起,这是一个愚蠢的错误。

答案 1 :(得分:1)

尝试写入文件夹时获取java.nio.file.AccessDeniedException

显然,Comodo防病毒软件具有“自动包含”设置,该设置也可能导致此确切错误。 (例如,用户可以写入某个位置,但是java.exejavaw.exe进程不能)。

在这种极端情况下,为进程和/或文件夹添加例外应该会有所帮助。

暂时禁用防病毒功能将有助于了解Comodo AV是否是罪魁祸首。

我发布此文章不是因为我使用或喜欢Comodo,而是因为它是其他功能正常的Java应用程序的明显症状,并且可能花费大量时间对文件权限进行故障排除,这些权限是理智和正确的,但是被第三方阻止应用。

答案 2 :(得分:0)

尝试复制文件时出现相同的错误。关闭与目标文件关联的通道即可解决此问题。

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);

答案 3 :(得分:0)

我的问题是创建文件夹,列出其中的文件并尝试删除

createF("testfolder");  
createF("testfolder/testAgain");  
listF("testfolder");  
listF("testfolder/testAgain");  
deleteF("testfolder/testAgain");  
deleteF("testfolder"); // error here

当我尝试删除“ testFolder”时,未删除“ testfolder / testAgain”。

  

在某些操作系统上,当此Java虚拟机或其他程序打开并使用文件时,可能无法删除该文件。

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

答案 4 :(得分:0)

删除.android文件夹缓存文件,同时从目录中手动删除build文件夹并打开android studio并再次运行。

enter image description here