2009-10-12 4 views
6

Что является самым кратким способом создания каталога под названием «Foo» под текущей рабочей папкой моего Java-приложения (если оно еще не существует)?Как создать каталог в текущем рабочем каталоге, в Java

Или несколько иной угол: что такое Java-эквивалент Directory.CreateDirectory("Foo") в .NET?

+0

Вы задали вопрос и сразу же отправили свой собственный ответ? – KLE

+0

-1. Кажется очень странным, чтобы задать вопрос и ответить. Переполнение стека не является микрофоном для вас, чтобы читать лекции. –

+4

+1. Является хорошим, чтобы опубликовать свой собственный вопрос и ответ. Помогает сообществу и полезен для дальнейшего использования. Если люди не согласны с вашим ответом, тогда они могут обеспечить лучший. Быстрый поиск * на Meta SO, похоже, согласен с тем, что это нормально. – Iain

ответ

7

Пакет java.io не имеет Directory класс, но вы можете использовать метод mkdir() на File класса вместо:

(new File("Foo")).mkdir() 

Обратите внимание, что mkdir() имеет два отдельных режима отказа:

  1. «Если существует менеджер безопасности и его метод checkWrite() не разрешает создание именованного каталога», то будет выброшен SecurityException.
  2. Если операция не выполнена по другой причине, mkdir() вернет значение false. (Более конкретно, он будет возвращать истинное тогда и только тогда, когда был создан каталог.)

Пункт 1 в порядке - если у вас нет разрешения, бросать. Точка 2 немного субоптимальна по трем причинам:

  1. Вам необходимо проверить логический результат этого метода. Если вы проигнорируете результат, операция может выйти из строя.
  2. Если вы получили ложное возвращение, вы не знаете, почему операция не удалась, что затрудняет восстановление или сформулировать значимое сообщение об ошибке.
  3. Строгая формулировка контракта «если и только если» также означает, что метод возвращает false, если каталог уже существует.

Помимо: Contrast точка 3 с поведением .NET Directory.CreateDirectory() который не делает ничего, если каталог существует. Этот вид имеет смысл - «создать каталог »; «ОК, каталог создан». Имеет ли значение, было ли это , созданное сейчас или ранее; этим процессом или другим? Если вы действительно заботились о том, что бы вы не задавали другой вопрос : «Существует ли этот каталог?»

Следующее предостережение заключается в том, что mkdir() не будет создавать больше одного каталога за раз. Для моего простого примера каталога с именем «Foo» это прекрасно; однако, если вы хотите создать каталог под названием Bar в каталоге Foo (т. е. создать каталог «Foo/Bar»), вы должны помнить, что вместо этого используйте метод mkdirs().

Так, чтобы обойти все эти предостережения, вы можете использовать вспомогательный метод, такие как:

public static File createDirectory(String directoryPath) throws IOException { 
    File dir = new File(directoryPath); 
    if (dir.exists()) { 
     return dir; 
    } 
    if (dir.mkdirs()) { 
     return dir; 
    } 
    throw new IOException("Failed to create directory '" + dir.getAbsolutePath() + "' for an unknown reason."); 
} 
+0

Вы задали вопрос и сразу же отправили свой собственный ответ? –

+5

Видно, что раньше идея заключалась в том, что пользователь, который отправляет комбинацию вопросов и ответов, хочет представить подробный ответ на какой-то вопрос, который может показаться простым в контексте, который направит тех людей, которые еще не знают, как это сделать с его собственный ответ. Совершенно приемлемо, на мой взгляд, хотя немного запутанно. – Esko

+1

А теперь я знаю, как часть «блога» видения Stackoverflow (http://sstatic.net/so/Img/stackoverflow-venn-diagram.png) происходит от :) – sfussenegger

1

Я видел несколько более сжатую форму вашего метода createDirectory:

File f = new File(xyz); 
if (!f.exists() && !f.mkdirs()) throw new IOException("Could not create directory " + f); 

Возможно, также стоит проверить, существует ли f, но не является каталогом.

Смежные вопросы