【问题标题】:Discovering the reason for File.mkdirs() failure发现 File.mkdirs() 失败的原因
【发布时间】:2011-11-23 02:42:28
【问题描述】:

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

【问题讨论】:

  • 我一直想知道为什么 mkdir() 的设计方式是这样的(并不是说它对我来说是个问题)。
  • delete() 相同,只是返回一个布尔值。如果不是SecurityException,则无法说明为什么会失败。

标签: java file io directory


【解决方案1】:

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

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

如果你坚信一切看起来都正确,但它仍然失败,我想你可以简单地将它放在一个循环中重试,比如 3 次。如果它仍然失败,并且根据您的应用程序,您可能会在 UI 级别发出某种警报,或将错误记录在日志文件中(假设您可以写入)。

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

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

【讨论】:

  • 不,事实并非如此。我发现了问题(父目录在集群的一个节点中拥有错误的所有者),但它要求我去另一层楼,与网络管理员交谈,让某人给我一个 ssh 会话,最后,输入 @ 987654325@。我希望有一种更实用的方法......
  • 好吧,你去 - IT 家伙的问题。 :)
  • 所有函数都应该返回错误代码,这样您就可以确定是 io 错误还是权限问题,而不仅仅是“失败”。这真是一个糟糕的界面。
【解决方案2】:

我在 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
}

exists() 返回 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() 没有的地方恢复。

【讨论】:

    猜你喜欢
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2013-12-22
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多