如果不存在,则创建文件和中间目录

时间:2014-02-11 17:02:29

标签: java file java-ee file-io java-io

当且仅当该文件不存在时,我想创建一个文件。

作为示例文件位置是指“C:\ user \ Desktop \ dir1 \ dir2 \ filename.txt”

if (!file.exists()) {
    try {
        file.createNewFile();
    } catch(IOException ioe) {                  
        ioe.printStackTrace();
        return;
    }
}

不幸的是上面的代码失败了,因为dir1dir2不存在。

对于我的案例

  • 有时dir1和dir2可能存在,有时它们可​​能不存在。
  • 我不想覆盖这些中间目录的内容(如果它们已经存在),

如何干净地检查?

我正在考虑添加以下检查来处理这种情况:

if (!file.getParentFile().getParentFile().exists()) {
    file.getParentFile().getParentFile().mkdirs();
}
if (!file.getParentFile().exists()) {
    file.getParentFile().mkdirs();
}

if (!file.exists()) {                               
    try {
        file.createNewFile();
    } catch(IOException ioe) {
        ioe.printStackTrace();
        return;
    }
}

或者有更明确的解决方案吗?

2 个答案:

答案 0 :(得分:7)

你可以做这类事情:

file.getParentFile().mkdirs();

  

创建此抽象路径名所指定的目录,包括任何必要但不存在的父目录。请注意,如果此操作失败,则可能已成功创建了一些必要的父目录。

<强>更新

if (file.getParentFile().exists || file.getParentFile().mkdirs()){
        try
        {
            file.createNewFile();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
            return;
        }
} else {
  /** could not create directory and|or all|some nonexistent parent directories **/
}

答案 1 :(得分:1)

请注意File.exists()检查是否存在文件目录。

而不是:

if(!file.exists()) {                               
    try {
        file.createNewFile();
    } catch(IOException ioe) {
        ioe.printStackTrace();
        return;
    }
}

您应该明确检查文件是否是文件,因为可能存在同名目录:

if(!file.isFile()) {                               
    try {
        file.createNewFile();
    } catch(IOException ioe) {
        ioe.printStackTrace();
        return;
    }
}

同样,您应检查父文件是否为目录:

if (!file.getParentFile().getParentFile().isDirectory()) { ... }