撤消java mkdirs()的效果

时间:2013-04-09 14:10:31

标签: java mkdirs

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

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

有人能想出一个聪明的方法吗?

5 个答案:

答案 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)

根据mkdirs() source code

判断
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。评价。