Как создать каталог в текущем рабочем каталоге на Java - PullRequest
6 голосов
/ 12 октября 2009

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

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

Ответы [ 2 ]

8 голосов
/ 12 октября 2009

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

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

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

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

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

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

В сторону: Контраст 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.");
}
1 голос
/ 12 октября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...