【问题标题】:Undo effects of java mkdirs()java mkdirs() 的撤销效果
【发布时间】:2013-04-09 14:10:31
【问题描述】:

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

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

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

【问题讨论】:

  • 结合File.exists()、File.isDirectory()和File.canWrite()不是更简单吗,而不是想办法撤销mkdirs()的作用?

标签: java mkdirs


【解决方案1】:

我认为这种方法可以完成工作,而无需您致电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();
}

【讨论】:

  • 我喜欢这种方法,因为之后没有清理。它的工作假设是,如果您对目录具有写入权限,您将能够在该目录下创建所需的子目录。然而,这并不是一个 100% 有效的测试。考虑包含无效字符的路径名,或破坏操作系统或底层文件系统允许的总长度的路径。上面的方法没有检查那些东西。但它已经足够满足我的需求了。非常感谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    有点危险:

    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();
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果我在文件结构中继承权限的假设是正确的,那么应该这样做:

      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();
         ...
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-03
          • 2021-12-27
          • 2015-05-06
          • 2013-09-06
          • 2019-09-22
          • 2021-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多