为什么file.mkdir返回false?
Google表示可能有多种原因(例如安全性,权限,路径名等)。
我的问题:
答案 0 :(得分:43)
如果您使用的是Java 7,则可以使用Files类。它会在错误时引发IOException,但描述非常好。
Files.createDirectory(file.toPath());
答案 1 :(得分:24)
如果安全/权限是一个原因,那么为什么不抛出SecurityException(在javadoc中提到)?
如果您没有JVM级权限来执行某些操作,而不是操作系统级别
,则会引发SecurityException
有没有办法找到返回false的确切原因?
不,AFAIK。唯一知道的方法是自己检查目录的权限,确保在调用之前它不存在,检查父目录是否存在等等。
但是,如果您使用 Java 7或更高版本,则可以使用NIO来创建目录。具体而言,Files.createDirectory
:
File dir = new File("mydir");
Files.createDirectory(dir.toPath());
如果您想使用java.io.File
完全使用NIO,可以使用Paths.get
代替Path
:
Path dir = Paths.get("mydir");
Files.createDirectory(dir);
在这两种情况下,如果无法创建目录,它将抛出一个IOException
,其中包含操作失败原因的确切原因。
对于Files
中的大多数方法都是如此,因此建议使用File
类中的方法。
答案 2 :(得分:8)
不,没有办法找到mkdirs()
返回false的确切原因,至少不是来自Java内部,因为它可能与操作系统有关。
如果SecurityException
的{{1}}和SecurityManager
方法存在安全规则,则会引发checkRead()
。如果存在操作系统权限问题,则不会抛出异常。
此外,请注意,如果您调用checkWrite()
,并且父目录不存在,File.mkdir()
将返回false。但是,调用mkdir()
将创建不存在的父目录。
答案 3 :(得分:1)
这是Windows特有的内容:在我的情况下,file.mkdir()
方法因NoSuchFileException
而失败,因为我试图直接创建嵌套目录结构(例如results\results_ddMMyyyy
,而没有先创建Windows上的results
目录。
但是,完全相同的代码在我的Mac上运行良好,即在Mac上未引发此类异常,并且results
方法隐式创建了中间file.mkdir()
目录。
希望这对以后的人有帮助。