3

我有一种情况,我需要运行“预检查”以查看目录是否“可创建。这不是问题,只需运行 afile.mkdirs()并查看它是否返回 true。

问题是我想在此检查后进行清理。这有点棘手,因为我只想删除那些mkdirs()实际创建的文件夹和子文件夹。

谁能想到一个聪明的方法来做到这一点?

4

5 回答 5

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();
}
于 2013-04-09T14:23:46.413 回答
0

保留一个包含该目录名称的数组。因此,当您要删除目录时,可以将该数组内容/字符串/目录名称删除。

于 2013-04-09T14:13:03.693 回答
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();
    }
}
于 2013-04-09T14:22:34.093 回答
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();
   ...
}
于 2013-04-09T14:22:42.630 回答
0

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。评论。

于 2013-04-09T14:24:16.303 回答