Как создать каталог на Java?


387

Как мне создать каталог / папку?

Однажды я проверил System.getProperty("user.home");

Я должен создать каталог (имя каталога «новая папка») тогда и только тогда, когда новой папки не существует.


24
пожалуйста, просмотрите ваш выбор правильного ответа. Решение, предложенное Джигар Джоши, вводит в заблуждение. Это не решает проблему правильно (см. Мой комментарий). (Простое) решение, предложенное Божо, намного лучше.
mwhs

mkdirидемпотентен в Java. Реализация выполнит проверку, если каталог существует для вас, и создаст его, только если он не существует.
MWS

Ответы:


461

Через ~ 7 лет я обновлю его, чтобы лучше подходить, как это предлагает Божо.

new File("/path/directory").mkdirs();

Запрещены:

File theDir = new File("new folder");

// if the directory does not exist, create it
if (!theDir.exists()) {
    System.out.println("creating directory: " + theDir.getName());
    boolean result = false;

    try{
        theDir.mkdir();
        result = true;
    } 
    catch(SecurityException se){
        //handle it
    }        
    if(result) {    
        System.out.println("DIR created");  
    }
}

241
-1: Это действительно очень плохая техника для создания каталога. Доступ к ФС не зарезервирован для выделенного ресурса. Между if(!theDir.exists())и theDir.mkdir()статус мог измениться, так же как он мог измениться между не созданием каталога (из-за existsвозврата true) и необходимостью. Результат метода existsникогда не должен использоваться, чтобы решить, создавать каталог или нет. Просто позвоните mkdir, никакое исключение не будет выброшено, если оно уже существует.
mwhs

4
@ mwhs Я понимаю, что лучше не проверять каталог, но я не понимаю вашего обоснования (вторая часть). Может ли статус измениться между вызовом mkdirи необходимостью каталога? Я предполагаю, что вы имели в виду, что какой-то другой процесс удаляет каталог.
Эпизодекс

2
@Episodex Каталоги являются общими ресурсами. Только не используйте вышеуказанное решение, оно неверно по разным причинам. Непонятно, как ПО могло подумать, что это правильный ответ. Если вам нужны утверждения о ресурсах ввода-вывода, вам нужно использовать блокировки, а не логические значения.
mwhs

44
@mhws Я знаю, что этому посту пару месяцев, но если вы посмотрите на mkdirsреализацию из исходного кода, самое первое, что вызывается, это if (exists()) { return false; }. Сама реализация сначала проверяет, существует ли каталог, поэтому единственное, в чем виноват этот ответ, возможно, это проверка этого условия 2x. Не так плохо, как ты думаешь.
Майкл Хогенсон

5
Начиная с Java 7, вы, вероятно, должны использовать методы, Filesкак в более недавнем ответе Бенуа Бланшона. (Этот ответ, кажется, был написан до Java 7.)
Brick

504
new File("/path/directory").mkdirs();

Здесь «каталог» - это имя каталога, который вы хотите создать / существовать.


30
Гораздо лучший ответ, чем тот, который ОП выбрал как правильный. Проверка существования каталога перед его созданием должна стать известным анти-паттерном.
MWS

7
Что делать, если каталог уже существует? Было бы перезаписать? или пропустить процесс.
Авинаш Радж

3
@AvinashRaj, пожалуйста, проверьте docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs ()
Tascalator

1
@Tascalator это не ясно из документации, вы можете уточнить? Также ответ должен быть дополнен ответом на what if the directory is already exists? It would do overwriting? or skip the process.вопрос.
mrgloom

3
это понятно:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

147

С Java 7 вы можете использовать Files.createDirectories().

Например:

Files.createDirectories(Paths.get("/path/to/directory"));

12
Я думаю, что этот вариант не существовал во время первоначальных вопросов и ответов, но я думаю, что это должен быть ответ в будущем.
Кирпич

6
Также было бы хорошо отметить, что:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Кит ОЙС

Спасибо за указание на разницу между createDirectory и createDirectories. Я считаю это плохим выбором имен.
Seinecle

(2019) Я использовал Files.createDirectory (Paths.get (directory.toString ())); где каталог - это объект File. Не забудьте поймать свое IOException
крип

@chrips Лучше directory.toPath()тогда делать .
Руслан Стельмаченко

37

Вы можете попробовать FileUtils # forceMkdir

FileUtils.forceMkdir("/path/directory");

В этой библиотеке много полезных функций.


1
Гораздо лучше, чем чистый mkdirs: обрабатывает параллелизм, проверяет, успешно ли выполнена операция, проверяет, существует ли каталог (не файл!).
Андрей

29

МакДир против МакДирс


Если вы хотите создать один каталог, используйте mkdir

new File("/path/directory").mkdir();

Если вы хотите создать иерархию структуры папок, используйте mkdirs

 new File("/path/directory").mkdirs();

22
  1. Создайте единый каталог.

    new File("C:\\Directory1").mkdir();
  2. Создайте каталог с именем «Directory2 и все его подкаталоги« Sub2 ″ и «Sub-Sub2 ″ вместе.

    new File("C:\\Directory2\\Sub2\\Sub-Sub2").mkdirs()

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


15

Для Java 7 и выше:

Path path = Paths.get("/your/path/string");
Files.createDirectories(path);

Кажется, нет необходимости проверять наличие dir или файла перед созданием, из javadocs createDirectories :

Создает каталог, сначала создавая все несуществующие родительские каталоги. В отличие от метода createDirectory, исключение не выдается, если каталог не может быть создан, поскольку он уже существует. Параметр attrs является необязательным атрибутом файла, который устанавливается атомарно при создании несуществующих каталогов. Каждый атрибут файла идентифицируется по его имени. Если в массив включено более одного атрибута с одним и тем же именем, то все, кроме последнего, игнорируются.

Если этот метод не работает, он может сделать это после создания некоторых, но не всех родительских каталогов.


7

Следующий метод должен делать то, что вы хотите, просто убедитесь, что вы проверяете возвращаемое значение mkdir () / mkdirs ()

private void createUserDir(final String dirName) throws IOException {
    final File homeDir = new File(System.getProperty("user.home"));
    final File dir = new File(homeDir, dirName);
    if (!dir.exists() && !dir.mkdirs()) {
        throw new IOException("Unable to create " + dir.getAbsolutePath();
    }
}

2
Как упомянуто в комментарии @mwhs к ответу Джигара Джоши, проверка на существование сначала не только не обязательна, но на самом деле плохая идея.
Bdoserror

4

Хотя на этот вопрос ответили. Я хотел бы добавить что-то дополнительное, то есть, если существует файл с именем каталога, который вы пытаетесь создать, это должно вызвать ошибку. Для будущих посетителей.

public static void makeDir()
{
    File directory = new File(" dirname ");
    if (directory.exists() && directory.isFile())
    {
        System.out.println("The dir with name could not be" +
        " created as it is a normal file");
    }
    else
    {
        try
        {
            if (!directory.exists())
            {
                directory.mkdir();
            }
            String username = System.getProperty("user.name");
            String filename = " path/" + username + ".txt"; //extension if you need one

        }
        catch (IOException e)
        {
            System.out.println("prompt for error");
        }
    }
}

3
Как упомянуто в комментарии @mwhs к ответу Джигара Джоши, проверка на существование сначала не только не обязательна, но на самом деле плохая идея.
Bdoserror

4

Опрятный и чистый:

import java.io.File;

public class RevCreateDirectory {

    public void revCreateDirectory() {
        //To create single directory/folder
        File file = new File("D:\\Directory1");
        if (!file.exists()) {
            if (file.mkdir()) {
                System.out.println("Directory is created!");
            } else {
                System.out.println("Failed to create directory!");
            }
        }
        //To create multiple directories/folders
        File files = new File("D:\\Directory2\\Sub2\\Sub-Sub2");
        if (!files.exists()) {
            if (files.mkdirs()) {
                System.out.println("Multiple directories are created!");
            } else {
                System.out.println("Failed to create multiple directories!");
            }
        }

    }
}

4

Ну, чтобы создать каталог / папку в Java у нас есть два метода

Здесь метод makedirectory создает один каталог, если он не существует.

File dir = new File("path name");
boolean isCreated = dir.mkdir();

А также

File dir = new File("path name");
boolean isCreated = dir.mkdirs();

Здесь метод makedirectories создаст все каталоги, которые отсутствуют в пути, который представляет файловый объект.

Например, ссылку ниже (объяснено очень хорошо). Надеюсь, поможет!! https://www.flowerbrackets.com/create-directory-java-program/


3

Просто хотел указать всем звонящим File.mkdir()или File.mkdirs()быть осторожным, Fileобъект - это каталог, а не файл. Например, если вы позвоните mkdirs()по пути /dir1/dir2/file.txt, он создаст папку с именем, file.txtкоторое, вероятно, не то, что вы хотели. Если вы создаете новый файл, а также хотите автоматически создавать родительские папки, вы можете сделать что-то вроде этого:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }

2

Этот способ работы для меня сделать один или несколько каталогов или их: необходимо импортировать java.io.File;
/ * введите код, указанный ниже, чтобы добавить dir1 директории или проверить, существует ли dir1, если нет, то создайте его и то же самое с dir2 и dir3 * /

    File filed = new File("C:\\dir1");
    if(!filed.exists()){  if(filed.mkdir()){ System.out.println("directory is created"); }} else{ System.out.println("directory exist");  }

    File filel = new File("C:\\dir1\\dir2");
    if(!filel.exists()){  if(filel.mkdir()){ System.out.println("directory is created");   }} else{ System.out.println("directory exist");  }

    File filet = new File("C:\\dir1\\dir2\\dir3");
    if(!filet.exists()){  if(filet.mkdir()){ System.out.println("directory is  created"); }}  else{ System.out.println("directory exist");  }

0

Эта функция позволяет создать каталог в домашнем каталоге пользователя.

private static void createDirectory(final String directoryName) {
    final File homeDirectory = new File(System.getProperty("user.home"));
    final File newDirectory = new File(homeDirectory, directoryName);
    if(!newDirectory.exists()) {
        boolean result = newDirectory.mkdir();

        if(result) {
            System.out.println("The directory is created !");
        }
    } else {
        System.out.println("The directory already exist");
    }
}

Как упомянуто в комментарии @mwhs к ответу Джигара Джоши, проверка на существование сначала не только не обязательна, но на самом деле плохая идея.
Bdoserror

0

если вы хотите быть уверены, что он создан, то это:

final String path = "target/logs/";
final File logsDir = new File(path);
final boolean logsDirCreated = logsDir.mkdir();
if (!logsDirCreated) {
    final boolean logsDirExists = logsDir.exists();
    assertThat(logsDirExists).isTrue();
}

beacuse mkDir()возвращает логическое значение, и findbugs будет запрашивать его, если вы не используете переменную. Также это не приятно ...

mkDir()возвращает только true, если mkDir()создает его. Если dir существует, он возвращает false, поэтому для проверки созданного dir вызывайте, только exists()если mkDir()return false.

assertThat()проверяет результат и завершается неудачно, если exists()возвращает false. ofc вы можете использовать другие вещи для обработки несозданного каталога.


-2
public class Test1 {
    public static void main(String[] args)
    {
       String path = System.getProperty("user.home");
       File dir=new File(path+"/new folder");
       if(dir.exists()){
           System.out.println("A folder with name 'new folder' is already exist in the path "+path);
       }else{
           dir.mkdir();
       }

    }
}

Как упомянуто в комментарии @mwhs к ответу Джигара Джоши, проверка на существование сначала не только не обязательна, но на самом деле плохая идея.
Bdoserror

-7

Вы также можете обратиться к функции makdir () для создания нового каталога в папке, где вы хотите.


9
Нет названного метода makdir. Если вы имели в виду mkdir, как это добавить что-либо к существующим ответам?
Тед Хопп
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.