尝试写入文件夹时获取 "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)
好吧,事实证明我在做一些愚蠢的事情。我没有将新文件名附加到路径中。
我有
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.exe
和 javaw.exe
进程不能)。
在这种极端情况下,为进程 and/or 文件夹添加例外应该会有所帮助。
暂时禁用防病毒功能将有助于了解 Comodo AV 是否是罪魁祸首。
我 post 这不是因为我使用或更喜欢 Comodo,而是因为它对于正常运行的 Java 应用程序来说是一个非常不明显的症状,并且可能会花费很多时间来解决文件权限问题,这些文件权限是理智和正确,但被第 3 方应用程序阻止。
打开我的 android 项目 (Android Studio) 很长时间后,它遇到了与上述相同的问题。
我通过“清洁项目”解决了它。您只需转到菜单“构建”>“清理项目”。
出于某种原因,每次我尝试使用 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)
好吧,事实证明我在做一些愚蠢的事情。我没有将新文件名附加到路径中。
我有
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.exe
和 javaw.exe
进程不能)。
在这种极端情况下,为进程 and/or 文件夹添加例外应该会有所帮助。
暂时禁用防病毒功能将有助于了解 Comodo AV 是否是罪魁祸首。
我 post 这不是因为我使用或更喜欢 Comodo,而是因为它对于正常运行的 Java 应用程序来说是一个非常不明显的症状,并且可能会花费很多时间来解决文件权限问题,这些文件权限是理智和正确,但被第 3 方应用程序阻止。
打开我的 android 项目 (Android Studio) 很长时间后,它遇到了与上述相同的问题。 我通过“清洁项目”解决了它。您只需转到菜单“构建”>“清理项目”。