文件mkdirs()无法按预期工作

时间:2018-05-07 05:11:24

标签: java

我目前正在尝试测试目录是否存在,如果不存在,我希望程序创建reportPath中指定的完整目录。运行代码时,mkdirs()返回false,并且未创建reportPath中指定的目录。 mkdirs()如果不存在,String reportPath = outputFile+"\\"+providerName+"\\"+testMode+"\\";//+testTarget+"\\"; File dir = new File(reportPath); if (!dir.exists()) { System.out.println("Report Directory does not exist"); System.out.println("Directory created:" + dir.mkdirs()); } PrintWriter writer = new PrintWriter(reportPath+fileName, "UTF-8"); int id = 1; writer.println("ID,Provider,Key Type,Key Size,Operation,Parameters,Data Size,Passed,Error details"); for (TestResult r : results) { writer.println(Integer.toString(id) + "," + r.provider + "," + r.keyType + "," + r.keySize + "," + r.operation + "," + r.parameter + "," + r.dataSize + "," + r.passed + "," + r.errorDetails); id++; } writer.close(); 是否会创建整个路径?

目前使用以下代码:

java.io.FileNotFoundException: <path> (Access is denied)
at java.io.FileOutputStream.open0(Native Method)
(followed by a long list of errors)

当我运行它时,我收到以下错误:

Ionic

2 个答案:

答案 0 :(得分:2)

你说:

  

权限似乎很好

外表可能具有欺骗性!

“访问被拒绝”正在发生,因为操作系统不允许您访问/创建/写入文件或目录。您可以假设它只是这样做,因为有关您的请求的某些内容违反了访问控制规则。

以下是一些可能性。

  1. 您使用的路径可能指的是您认为的其他文件或目录;例如它可能是一个相对路径,当前目录不是你想的,或者路径名中可能有错误(拼写,区分大小写等)

  2. 应用程序可能无法以正确的用户身份运行。或者在Windows上,它可能没有管理员权限(如果需要)。或者许多用户不在正确的组中(在UNIX / Linux上......)

  3. 权限可能不是您的想法。你检查过组权限了吗?你检查过ACL吗?您是否检查了路径中的所有目录...从文件系统根目录开始?

  4. 在Linux上,这可能与SELinux或AppArmor有关,或者在Docker容器中运行,或类似的东西。

  5. 如果您尝试在本地安装的远程文件系统上创建目录,可能是由于本地和远程身份系统之间不匹配。

  6. 如果您正在尝试使用GPFS / AFM缓存,NFS身份映射等等......

  7. 摘要:某些错误的权限/访问控制,这就是问题所在。

答案 1 :(得分:1)

java.io.File已经过时了。改为使用java.nio.file package

Path dir = Paths.get(outputFile, providerName, testMode);
Files.createDirectories(dir);

PrintWriter writer = new PrintWriter(Files.newBufferedWriter(dir.resolve(fileName)));

java.io.File的大多数方法只返回一个布尔值,而不告诉你出了什么问题。 Files的方法如果返回则总是成功;如果他们失败了,他们会抛出一个信息丰富且有用的例外。