我遇到需要运行“预检”以查看目录是否为“可创建”的情况。这不是问题,只需运行file.mkdirs()
并查看它是否返回true。
问题是我想在检查后清理。这有点棘手,因为我只想删除那些mkdirs()
实际创建的文件夹和子文件夹。
有人能想出一个聪明的方法吗?
答案 0 :(得分:2)
我认为这种方法无需拨打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();
}
答案 1 :(得分:0)
保留一个包含该dirs名称的数组。因此,当您想删除dir时,可以将该数组内容/字符串/目录名删除。
答案 2 :(得分:0)
有点危险:
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();
}
}
答案 3 :(得分:0)
如果我假设权限在文件结构中继承是正确的,那么应该这样做:
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();
...
}
答案 4 :(得分:0)
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。评价。