48

为什么 file.mkdir 返回 false?

Google 指出可能有多种原因(例如安全性、权限、路径名等)。

我的问题:

  1. 如何找到返回false的确切原因?
  2. 如果安全/权限是一个原因,那么为什么不抛出 SecurityException?
4

4 回答 4

47

如果目录已经存在,mkdir 和 mkdirs 返回 false,因此这可能是失败的原因之一。

如果您使用的是 Java 7,则可以使用 Files 类。它会在错误时抛出一个 IOException 并提供非常好的描述。

Files.createDirectory(file.toPath());
于 2012-08-30T19:26:29.393 回答
37

如果安全/权限是一个原因,那么为什么没有抛出 SecurityException(在 javadoc 中提到)?

ASecurityException当你没有 JVM 级别的权限做某事时抛出,而不是操作系统级别的权限

有没有办法找到返回 false 的确切原因?

不,AFAIK。唯一知道的方法是自己检查目录的权限,在调用它们之前确保它不存在,检查父目录是否存在等。

但是,如果您使用的是Java 7 或更高版本,则可以改用 NIO 来创建目录。具体来说,Files.createDirectory

File dir = new File("mydir");
Files.createDirectory(dir.toPath());

如果你想完全使用 NIO 而不是 using java.io.File,你可以使用Paths.get来创建一个Path

Path dir = Paths.get("mydir");
Files.createDirectory(dir);

在这两种情况下,如果无法创建目录,它将抛出一个IOException操作失败的确切原因。

对于 中的大多数方法都是如此Files,因此建议使用它而不是使用File类中的方法。

于 2012-08-30T18:06:39.417 回答
7
  1. 不,没有办法找到mkdirs()返回 false 的确切原因,至少不是来自 Java 内部,因为它可能取决于操作系统。

  2. 如果's和方法SecurityException中存在安全违规,则抛出A。如果存在操作系统权限问题,则不会引发异常。SecurityManagercheckRead()checkWrite()


另外,请注意,如果您调用File.mkdir(),并且父目录不存在,mkdir()将返回 false。但是,调用File.mkdirs()将创建不存在的父目录。

于 2012-08-30T18:06:44.957 回答
1

这是 Windows 特有的内容:在我的例子中,该file.mkdir()方法失败了,NoSuchFileException因为我试图在 Windows 上直接创建嵌套目录结构(例如results\results_ddMMyyyy,不首先创建results目录)。

但是,完全相同的代码在我的 Mac 上运行良好,即在 Mac 上没有引发此类异常,并且中间results目录是由该file.mkdir()方法隐式创建的。

希望这对将来的人有所帮助。

于 2019-02-04T06:29:18.590 回答