我有一种情况,我需要运行“预检查”以查看目录是否“可创建”。这不是问题,只需运行 afile.mkdirs()
并查看它是否返回 true。
问题是我想在此检查后进行清理。这有点棘手,因为我只想删除那些mkdirs()
实际创建的文件夹和子文件夹。
谁能想到一个聪明的方法来做到这一点?
我认为这种方法无需您调用即可完成工作mkdirs
:
public static boolean canMkdirs(File dir) {
if(dir == null || dir.exists())
return false;
File parent = null;
try {
parent = dir.getCanonicalFile().getParentFile();
while(!parent.exists())
parent = parent.getParentFile();
} catch(NullPointerException | IOException e) {
return false;
}
return parent.isDirectory() && parent.canWrite();
}
保留一个包含该目录名称的数组。因此,当您要删除目录时,可以将该数组内容/字符串/目录名称删除。
有点危险:
if (file.mkdirs()) {
long t0 = file.lastModified();
for (;;) {
long t = file.lastModified();
if (t < t0 - 1000L) { // Created longer than it's child minus 1 s?
break;
}
t0 = t;
file.delete();
file = file.getParentFile();
}
}
如果我在文件结构中继承权限的假设是正确的,那么应该这样做:
File f = new File("C:\\doesntExist\\Nope\\notHere");
File tempFile = f;
while (!tempFile.exists())
tempFile = tempFile.getParentFile();
if (!tempFile.canWrite()
&& tempFile.isDirectory()) // Copied this line from Lone nebula's answer (don't tell anyone, ok?)
System.out.println("Can't write!");
else
{
f.mkdirs();
...
}
从mkdirs()
源代码来看:
public boolean mkdirs() {
if (exists()) {
return false;
}
if (mkdir()) {
return true;
}
File canonFile = null;
try {
canonFile = getCanonicalFile();
} catch (IOException e) {
return false;
}
File parent = canonFile.getParentFile();
return (parent != null && (parent.mkdirs() || parent.exists()) &&
canonFile.mkdir());
}
如果我没有错过什么,你有两个选择:
mkdirs()
,将其与之后的状态进行比较mkdirs()
,必要时进行处理
File
类和覆盖mkdirs()
方法以准确记住创建了哪些文件。如果创建了,请处理它们。后者似乎是一个更优雅的解决方案,它将产生更少的代码。
更新:
我强烈建议考虑大卫 a。评论。