出于某种原因,每次我尝试使用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)
答案 0 :(得分:66)
好吧事实证明我做的事情很愚蠢。我没有将新文件名添加到路径中。
我有
rootDirectory = "C:\\safesite_documents"
但应该是
rootDirectory = "C:\\safesite_documents\\newFile.jpg"
对不起,这是一个愚蠢的错误。
答案 1 :(得分:1)
尝试写入文件夹时获取
java.nio.file.AccessDeniedException
显然,Comodo防病毒软件具有“自动包含”设置,该设置也可能导致此确切错误。 (例如,用户可以写入某个位置,但是java.exe
和javaw.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)