发现File.mkdirs()失败的原因

时间:2011-09-22 18:58:18

标签: java file io directory

如果我在Java中调用其中一个方法File.mkdir()File.mkdirs(),并返回false,有没有办法知道为什么没有创建目录?

2 个答案:

答案 0 :(得分:4)

不是,不。如果没有抛出SecurityException,那么最可能的原因是路径中的拼写错误,这意味着您不小心指定了新目录的父路径,这些路径在某种程度上是无效的。

我不认为你把它包裹在try { ... } catch (Exception e)块中,你没有意识到正在抛出SecurityException,因为你正在捕捉SecurityException的祖先你呢?

如果你一直认为一切看起来都是正确的,而且它仍然失败,我想你可以简单地把它放在一个循环中,重试三次。如果它仍然失败,并且取决于您的应用程序,您可能会在UI级别发出某种警报,或者将错误记录在日志文件中(假设您可以写入它)。

我认为一些更深层次的I / O问题可能阻止它工作,但除了简单地通知用户失败之外,您在应用程序级别上(或者真的应该)做的事情并不多。如果I / O中存在更深层次的错误,则更可能是系统/硬件/操作系统出现问题,或者完全不知道您无法控制子系统/服务崩溃等问题。

......如果发生了这种情况,IT人员有责任修复,而不是你的应用程序。除非您的应用程序以某种方式导致崩溃。

答案 1 :(得分:0)

我在UNC路径上的Windows上出现了mkdirs()故障。 代码如下:

public File getOldDirectoryPath(String root, String name)
{   
    File fulldir = new File(root, name)
    boolean created = false

    int retry = 0
    while (!created) {
        retry++
        if (!(created = fulldir.exists())) {
            if (20 == retry) break 
            if (!fulldir.mkdirs()) {
                sleep(100)
                fulldir = new File(root, name)
            }
        }
    }
    return fulldir.exists() ? fulldir : null
}

似乎存在某种类型的缓存,其中exist()返回false(不存在),但是文件系统上的mkdir失败,因为它确实存在。重新创建File()条目或延长超时都没有影响。

我在elasticsearch上发现了一个插件来修复Windows上的SMB问题。在研究解决方案时,它使用nio.file而不是io.File。重写该功能可解决以下问题:

public File getDirectoryPath(String root, String name)
{   
    Path fulldir = Paths.get(root, name)
    boolean created = false

    int retry = 0
    while (!created) {
        retry++
        if (!(created = Files.isDirectory(fulldir))) {
            if (20 == retry) break
            try {
                Files.createDirectories(fulldir)
            } catch (Throwable thx) {
                // error handling
            }
        }
    }
    return fulldir.toFile()
}

createDirectories()有时会失败,但是会在mkdirs()没有的地方恢复。