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