Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发现文件.mkdirs()失败的原因_Java_File_Io_Directory - Fatal编程技术网

Java 发现文件.mkdirs()失败的原因

Java 发现文件.mkdirs()失败的原因,java,file,io,directory,Java,File,Io,Directory,如果我在Java中调用方法File.mkdir()或File.mkdirs(),它返回false,有没有办法知道为什么没有创建目录?没有,没有。如果没有抛出SecurityException,那么最有可能的原因是路径中的键入错误,这意味着您意外地为新目录指定了一个无效的父路径 我不认为您将它包装在try{…}catch(异常e)块中,您没有意识到正在抛出SecurityException,因为您正在捕获SecurityException的祖先,是吗 如果您坚信一切看起来都是正确的,但它仍然失败,

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

没有,没有。如果没有抛出
SecurityException
,那么最有可能的原因是路径中的键入错误,这意味着您意外地为新目录指定了一个无效的父路径

我不认为您将它包装在
try{…}catch(异常e)
块中,您没有意识到正在抛出
SecurityException
,因为您正在捕获
SecurityException
的祖先,是吗

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

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

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

我在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()无法恢复的地方会恢复。

我一直想知道为什么
mkdir()
是这样设计的(这对我来说从来都不是问题)。与
delete()
一样,只返回一个布尔值。如果不是
SecurityException
,则无法说明为什么某些内容失败。不,事实并非如此。我发现了这个问题(父目录在集群的一个节点中有一个错误的所有者),但这需要我转到另一层,与网络管理员交谈,请某人给我一个ssh会话,最后键入
mkdir my/failure/path
。我希望有一种更实际的方法来做这件事……好了,这就是it人员的问题。:)所有函数都应该返回错误代码,这样您就可以知道这是一个io错误还是权限问题,而不仅仅是“失败”。这真是一个糟糕的界面。