Як створити каталог на Java?


386

Як створити каталог / папку?

Одного разу я тестував System.getProperty("user.home");

Я повинен створити каталог (ім'я каталогів "нова папка"), якщо і лише тоді, коли нової папки не існує.


24
будь ласка, перегляньте свій вибір правильної відповіді. Рішення, запропоноване ДжигарДжоші, вводить в оману. Він не вирішує проблему правильно (див. Мій коментар). (Просте) рішення, запропоноване Божо, набагато краще.
mwhs

mkdirє імепотенційним у Java. Реалізація зробить перевірку, чи існує для вас каталог, і створить її лише тоді, коли вона не існує.
mwhs

Відповіді:


460

Через ~ 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");  
    }
}

240
-1: Це насправді дуже погана методика створення каталогу. Доступ до ФС не зарезервований на виділений ресурс. Між if(!theDir.exists())і theDir.mkdir()статус може змінитися, так само як це може змінитися між НЕ створенням каталогу (з - за existsповерненням true) і необхідності його. Результат методу existsніколи не повинен використовуватися для вирішення питання про створення каталогу чи ні. Просто зателефонуйте mkdir, виняток не буде викинуто, якщо він уже існує.
mwhs

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

2
Каталоги @Episodex - це спільні ресурси. Просто не використовуйте вищезазначене рішення, це неправильно з різних причин. Незрозуміло, як міг би подумати, що це правильна відповідь. Якщо ви хочете твердити про ресурси IO, вам потрібно використовувати блоки, а не булеві.
mwhs

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

5
Що стосується Java 7, ви, ймовірно, повинні використовувати методи, Filesяк в останній відповіді Бенуа Бланшона. (Здається, ця відповідь була написана перед Java 7.)
Цегла

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

Тут "каталог" - це назва каталогу, який ви хочете створити / існувати.


30
Набагато краща відповідь, ніж обрана ОП правильною. Перевірка на наявність каталогу перед його створенням має стати відомим анти-шаблоном.
mwhs

7
що робити, якщо каталог вже існує? Це буде робити перезапис? або пропустити процес.
Авінаш Радж


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

3
зрозуміло:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

146

З 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
Кіт ОЙ

Дякуємо, що вказали на різницю btw createDirectory і createDirectories. Я вважаю це поганим вибором імен.
seinecle

(2019) я використовував Files.createDirectory (Paths.get (directory.toString ())); де каталог - це об'єкт File. Не забудьте зловити свій IOException
щебетати

@chrips Це краще робити directory.toPath()тоді.
Руслан Стельмаченко

37

Ви можете спробувати FileUtils # forceMkdir

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

У цій бібліотеці багато корисних функцій.


1
Набагато краще, ніж чисті mkdirs: обробляє паралельність, перевіряє, чи вдалася операція, перевіряє, чи існує каталог (а не файл!).
Андрій

28

mkdir vs mkdirs


Якщо ви хочете створити єдиний каталог, використовуйте mkdir

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

Якщо ви хочете створити ієрархію структури папок, використовуйте mkdirs

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

21
  1. Створіть єдиний каталог.

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

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

Джерело: у цьому ідеальному підручнику ви також знайдете приклад використання.


14

Для Java 7 і вище:

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

Здається, не потрібно перевіряти наявність dir або файлу перед створенням із createDirectories javadocs :

Створює каталог, створюючи спочатку всі неіснуючі батьківські каталоги. На відміну від методу 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()повертає істину лише тоді, коли mkDir()створює її. Якщо dir існує, він повертає false, тому для перевірки створеного вами dir дзвоніть, exists()якщо mkDir()return false.

assertThat()перевірить результат і не вдасться, якщо exists()повернеться хибним. 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.