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

Getting "java.nio.file.AccessDeniedException" when trying to write to a folder

出于某种原因,每次我尝试使用 Tomcat 上的 java 网络应用程序写入计算机上的文件夹时,我总是收到 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();
    }

这里是错误:

Exception: 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) at java.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)

可能的原因: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.

好吧,事实证明我在做一些愚蠢的事情。我没有将新文件名附加到路径中。

我有

rootDirectory = "C:\safesite_documents"

但应该是

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

抱歉,一如既往的愚蠢错误。

我在尝试复制文件时遇到了同样的错误。关闭与目标文件关联的通道解决了问题。

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

不是这个问题的答案

我在尝试删除我删除了其中文件的文件夹时出现此异常。

示例:

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

虽然deleteFile("folder/file");返回已删除,但程序重启后该文件夹才会被视为空

On some operating systems it may not be possible to remove a file when it is open and in use by this Java virtual machine or other programs.

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

删除 .android 文件夹缓存文件,同时从目录中手动删除构建文件夹,然后再次打开 android studio 和 运行。

Getting java.nio.file.AccessDeniedException when trying to write to a folder

很明显,Comodo 防病毒软件有一个“自动遏制”设置,也可能导致这个确切的错误。 (例如,用户可以写入某个位置,但 java.exejavaw.exe 进程不能)。

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

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

我 post 这不是因为我使用或更喜欢 Comodo,而是因为它对于正常运行的 Java 应用程序来说是一个非常不明显的症状,并且可能会花费很多时间来解决文件权限问题,这些文件权限是理智和正确,但被第 3 方应用程序阻止。

打开我的 android 项目 (Android Studio) 很长时间后,它遇到了与上述相同的问题。 我通过“清洁项目”解决了它。您只需转到菜单“构建”>“清理项目”。