Създаване на файлови и междинни директории, ако не съществуват

Искам да създам файл, ако и само ако този файл не съществува.

Като пример за файлово местоположение се отнася до "C:\user\Desktop\dir1\dir2\filename.txt"

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

За съжаление горният код е неуспешен, тъй като dir1 и dir2 не съществуват.

За моя случай

  • Понякога 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;
    }
}

Или има по-ясно решение от това?


person Exploring    schedule 11.02.2014    source източник
comment
Не е нужно да проверявате exists(). mkdirs() ще създаде директория само ако не съществува.   -  person Rohit Jain    schedule 11.02.2014
comment
Какво ще се случи, ако директорията вече съществува и аз извиквам отново mkdirs()?   -  person Exploring    schedule 11.02.2014
comment
Ще пропусне това. Няма да създаде нова директория. Проверете документа за този метод. Ясно се споменава това нещо.   -  person Rohit Jain    schedule 11.02.2014
comment
Документът само споменава - вярно, ако и само ако директорията е създадена, заедно с всички необходими родителски директории; невярно в противен случай   -  person Exploring    schedule 11.02.2014
comment
Re-Docs - Създава директорията, наречена с този абстрактен път, включително всички необходими, но несъществуващи родителски директории. Имайте предвид, че ако тази операция е неуспешна, може да е успяла да създаде някои от необходимите родителски директории.   -  person Rohit Jain    schedule 11.02.2014
comment
Защо искате да създадете празен файл, ако и само ако той не съществува? Ако това е някакъв вид преамбюл към създаването на FileOutputStream или FileWriter,, единствената част, която е необходима, е частта mkdirs().   -  person user207421    schedule 12.02.2014


Отговори (2)


можете да направите нещо от този вид:

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 **/
}
person Алексей    schedule 11.02.2014
comment
Вече споменах за това в моето решение. Така че това не е отговор. - person Exploring; 11.02.2014
comment
Кодът, публикуван от user1631616, не е правилен. file.getParentFile().mkdirs() ще върне false за случая, когато директорията вече е там. Това може да се провери и от док. В документа се споменава - true if and only if the directory was created, along with all necessary parent directories; false otherwise. - person Exploring; 11.02.2014
comment
@Baishakh да, прав си, ще върне истина само в случай, че е създадена директория. добавих проверка за съществуване. на вашата редакция сляпото правене на file.getParentFile().mkdirs() е лоша практика, тъй като все още може да не успее да създаде всички директории - person Алексей; 11.02.2014
comment
Добре. В този случай всичко се свежда до проверка на exists() след извикването на mkdirs()? - person Exploring; 11.02.2014
comment
@Baishakh Повторението не означава, че това не е отговор. Ако смятате, че е неправилно, гласувайте против, а не маркирайте. - person tacaswell; 13.02.2014
comment
Модификацията на тази публикация от потребител pat промени значително логиката на този отговор и вместо това трябваше да бъде спомената в коментар. @user1631616, може да искате да прегледате неговите промени в хронологията на редакциите. - person Paul Lammertsma; 13.02.2014

Внимавайте, че 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()) { ... }
person Paul Lammertsma    schedule 13.02.2014