【问题标题】:Getting "java.nio.file.AccessDeniedException" when trying to write to a folder尝试写入文件夹时出现“java.nio.file.AccessDeniedException”
【发布时间】:2015-04-24 14:05:45
【问题描述】:

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

【问题讨论】:

  • 尝试写入其他驱动器中的文件夹并检查。
  • 不,它不适用于不同的驱动器或不同的文件夹。一件事可能是我电脑上的所有文件夹都标记为“只读”,即使它们不是只读的。当我取消标记后,它们会再次被检查。
  • @OneTwo,是否有任何其他代码正在使用相同路径的可能性。就像您访问了相同的路径而忘记释放资源一样。
  • 不,我尝试在测试 java main 方法中编写一个字节数组,项目没有别的,我仍然得到同样的错误。据我所知,我没有打开其他正在访问该文件夹的应用程序。
  • 我犯了同样的错误,您必须针对文件而不是文件夹。但是为什么它会抛出那个异常呢?它与文件/文件夹的访问无关,对吧?

标签: java file-io io access-denied


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    我发布这篇文章并不是因为我使用或喜欢 Comodo,而是因为它对于其他功能正常的 Java 应用程序来说是一个非常不明显的症状,并且可能需要花费数小时来排除正常且正确但被第 3 方阻止的文件权限申请。

    【讨论】:

      【解决方案3】:

      不是这个问题的答案

      我在尝试删除我删除了其中文件的文件夹时遇到了这个异常。

      例子:

      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-

      Explanation from dhke

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          我有

          rootDirectory = "C:\\safesite_documents"
          

          但应该是的

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

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

          【讨论】:

          • 这似乎是java.nio.file.AccessDeniedException 的主要原因。有时很难调试,但是,如果你得到了这个,你应该检查你用java设置的所有系统属性和你的配置文件
          • 只是分享,我的是系统属性不允许我的服务器“jboss”写入文件。 +1 @MarkoPacak
          • 我已经有一段时间没有像这样在 Windows 上进行开发了,但我很确定你不需要 \\ 而是可以使用 /
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多