如果我在Java中调用其中一个方法File.mkdir()
或File.mkdirs()
,并返回false
,有没有办法知道为什么没有创建目录?
答案 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()没有的地方恢复。