File.mkdir 或 mkdirs 返回 false - 原因?

Posted

技术标签:

【中文标题】File.mkdir 或 mkdirs 返回 false - 原因?【英文标题】:File.mkdir or mkdirs return false - Reason? 【发布时间】:2012-08-25 12:41:54 【问题描述】:

为什么 file.mkdir 返回 false?

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

我的问题:

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

【问题讨论】:

【参考方案1】:

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

当您没有 JVM 级别的权限而不是操作系统级别的权限时,会抛出 SecurityException

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

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

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

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

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

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

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

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

【讨论】:

使用“mkdir”,如果您尝试 mkdir("/path1/path2/");并且path1(父)文件夹在您执行命令之前不存在,mkdir 将失败,它只能在已存在的文件夹中创建一个新文件夹,mkdirs 可以创建所有文件夹-path1 和path2。我对 mkdirs 的失败一无所知。希望对您有所帮助 @Andiana 正确。这是因为 Java 的 File.mkdir 遵循 Linux 约定而不是 Windows 约定,并且它不创建中间目录。 File.mkdirs 遵循 Windows 约定,其行为类似于 Linux 中的 mkdir --parents。好点子。尽管如此,为了得到确切的原因,迈克尔的回答是最好的:使用 Java 的 NIO 包。【参考方案2】:

这里有一些特定于 Windows 的内容:在我的例子中,file.mkdir() 方法以 NoSuchFileException 失败,因为我试图直接创建一个嵌套目录结构(例如 results\results_ddMMyyyy 而不首先创建 results 目录)窗户。

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

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

【讨论】:

【参考方案3】:

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

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

Files.createDirectory(file.toPath());

【讨论】:

如果目录已存在或创建目录时出错,则返回 false。现在有一个有用的 API。 android API 26 或以上要求!有向后兼容性吗?【参考方案4】:

    不,没有办法找到 mkdirs() 返回 false 的确切原因,至少不是来自 Java,因为它可能取决于操作系统。

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


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

【讨论】:

以上是关于File.mkdir 或 mkdirs 返回 false - 原因?的主要内容,如果未能解决你的问题,请参考以下文章

警告:File.mkdir() 被忽略

java.io.File的java中mkdir()和mkdirs()之间的区别[关闭]

file类的mkdir()和mkdirs()比较

Java - File 之 mkdir() & mkdirs() 区别

Java - File 之 mkdir() & mkdirs() 区别

新建文件夹,复制文件,glide保存文件android 获取sdcard,获取data.data 目录file.mkdirs() file.mkdir()Device File Expl