пожалуйста, просмотрите ваш выбор правильного ответа. Решение, предложенное Джигар Джоши, вводит в заблуждение. Это не решает проблему правильно (см. Мой комментарий). (Простое) решение, предложенное Божо, намного лучше.
mwhs
mkdirидемпотентен в Java. Реализация выполнит проверку, если каталог существует для вас, и создаст его, только если он не существует.
MWS
Ответы:
461
Через ~ 7 лет я обновлю его, чтобы лучше подходить, как это предлагает Божо.
newFile("/path/directory").mkdirs();
Запрещены:
File theDir =newFile("new folder");// if the directory does not exist, create itif(!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");}}
-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
newFile("/path/directory").mkdirs();
Здесь «каталог» - это имя каталога, который вы хотите создать / существовать.
Гораздо лучший ответ, чем тот, который ОП выбрал как правильный. Проверка существования каталога перед его созданием должна стать известным анти-паттерном.
MWS
7
Что делать, если каталог уже существует? Было бы перезаписать? или пропустить процесс.
@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
Я думаю, что этот вариант не существовал во время первоначальных вопросов и ответов, но я думаю, что это должен быть ответ в будущем.
Кирпич
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
Создает каталог, сначала создавая все несуществующие родительские каталоги. В отличие от метода createDirectory, исключение не выдается, если каталог не может быть создан, поскольку он уже существует. Параметр attrs является необязательным атрибутом файла, который устанавливается атомарно при создании несуществующих каталогов. Каждый атрибут файла идентифицируется по его имени. Если в массив включено более одного атрибута с одним и тем же именем, то все, кроме последнего, игнорируются.
Если этот метод не работает, он может сделать это после создания некоторых, но не всех родительских каталогов.
Как упомянуто в комментарии @mwhs к ответу Джигара Джоши, проверка на существование сначала не только не обязательна, но на самом деле плохая идея.
Bdoserror
4
Хотя на этот вопрос ответили. Я хотел бы добавить что-то дополнительное, то есть, если существует файл с именем каталога, который вы пытаетесь создать, это должно вызвать ошибку. Для будущих посетителей.
publicstaticvoid makeDir(){File directory =newFile(" 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");}}}
Как упомянуто в комментарии @mwhs к ответу Джигара Джоши, проверка на существование сначала не только не обязательна, но на самом деле плохая идея.
Bdoserror
4
Опрятный и чистый:
import java.io.File;publicclassRevCreateDirectory{publicvoid revCreateDirectory(){//To create single directory/folderFile file =newFile("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/foldersFile files =newFile("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!");}}}}
Просто хотел указать всем звонящим File.mkdir()или File.mkdirs()быть осторожным, Fileобъект - это каталог, а не файл. Например, если вы позвоните mkdirs()по пути /dir1/dir2/file.txt, он создаст папку с именем, file.txtкоторое, вероятно, не то, что вы хотели. Если вы создаете новый файл, а также хотите автоматически создавать родительские папки, вы можете сделать что-то вроде этого:
Этот способ работы для меня сделать один или несколько каталогов или их: необходимо импортировать java.io.File;
/ * введите код, указанный ниже, чтобы добавить dir1 директории или проверить, существует ли dir1, если нет, то создайте его и то же самое с dir2 и dir3 * /
File filed =newFile("C:\\dir1");if(!filed.exists()){if(filed.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}File filel =newFile("C:\\dir1\\dir2");if(!filel.exists()){if(filel.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}File filet =newFile("C:\\dir1\\dir2\\dir3");if(!filet.exists()){if(filet.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}
beacuse mkDir()возвращает логическое значение, и findbugs будет запрашивать его, если вы не используете переменную. Также это не приятно ...
mkDir()возвращает только true, если mkDir()создает его. Если dir существует, он возвращает false, поэтому для проверки созданного dir вызывайте, только exists()если mkDir()return false.
assertThat()проверяет результат и завершается неудачно, если exists()возвращает false. ofc вы можете использовать другие вещи для обработки несозданного каталога.
publicclassTest1{publicstaticvoid main(String[] args){String path =System.getProperty("user.home");File dir=newFile(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();}}}
mkdir
идемпотентен в Java. Реализация выполнит проверку, если каталог существует для вас, и создаст его, только если он не существует.Ответы:
Через ~ 7 лет я обновлю его, чтобы лучше подходить, как это предлагает Божо.
Запрещены:
источник
if(!theDir.exists())
иtheDir.mkdir()
статус мог измениться, так же как он мог измениться между не созданием каталога (из-заexists
возвратаtrue
) и необходимостью. Результат методаexists
никогда не должен использоваться, чтобы решить, создавать каталог или нет. Просто позвонитеmkdir
, никакое исключение не будет выброшено, если оно уже существует.mkdir
и необходимостью каталога? Я предполагаю, что вы имели в виду, что какой-то другой процесс удаляет каталог.mkdirs
реализацию из исходного кода, самое первое, что вызывается, этоif (exists()) { return false; }
. Сама реализация сначала проверяет, существует ли каталог, поэтому единственное, в чем виноват этот ответ, возможно, это проверка этого условия 2x. Не так плохо, как ты думаешь.Files
как в более недавнем ответе Бенуа Бланшона. (Этот ответ, кажется, был написан до Java 7.)Здесь «каталог» - это имя каталога, который вы хотите создать / существовать.
источник
what if the directory is already exists? It would do overwriting? or skip the process.
вопрос.Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
С Java 7 вы можете использовать
Files.createDirectories()
.Например:
источник
Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
directory.toPath()
тогда делать .Вы можете попробовать FileUtils # forceMkdir
В этой библиотеке много полезных функций.
источник
МакДир против МакДирс
Если вы хотите создать один каталог, используйте
mkdir
Если вы хотите создать иерархию структуры папок, используйте
mkdirs
источник
Создайте единый каталог.
Создайте каталог с именем «Directory2 и все его подкаталоги« Sub2 ″ и «Sub-Sub2 ″ вместе.
Источник: этот идеальный учебник , вы также найдете пример использования.
источник
Для Java 7 и выше:
Кажется, нет необходимости проверять наличие dir или файла перед созданием, из javadocs createDirectories :
источник
Следующий метод должен делать то, что вы хотите, просто убедитесь, что вы проверяете возвращаемое значение mkdir () / mkdirs ()
источник
Хотя на этот вопрос ответили. Я хотел бы добавить что-то дополнительное, то есть, если существует файл с именем каталога, который вы пытаетесь создать, это должно вызвать ошибку. Для будущих посетителей.
источник
Опрятный и чистый:
источник
Ну, чтобы создать каталог / папку в Java у нас есть два метода
Здесь метод makedirectory создает один каталог, если он не существует.
А также
Здесь метод makedirectories создаст все каталоги, которые отсутствуют в пути, который представляет файловый объект.
Например, ссылку ниже (объяснено очень хорошо). Надеюсь, поможет!! https://www.flowerbrackets.com/create-directory-java-program/
источник
Просто хотел указать всем звонящим
File.mkdir()
илиFile.mkdirs()
быть осторожным,File
объект - это каталог, а не файл. Например, если вы позвонитеmkdirs()
по пути/dir1/dir2/file.txt
, он создаст папку с именем,file.txt
которое, вероятно, не то, что вы хотели. Если вы создаете новый файл, а также хотите автоматически создавать родительские папки, вы можете сделать что-то вроде этого:источник
Этот способ работы для меня сделать один или несколько каталогов или их: необходимо импортировать java.io.File;
/ * введите код, указанный ниже, чтобы добавить dir1 директории или проверить, существует ли dir1, если нет, то создайте его и то же самое с dir2 и dir3 * /
источник
Эта функция позволяет создать каталог в домашнем каталоге пользователя.
источник
если вы хотите быть уверены, что он создан, то это:
beacuse
mkDir()
возвращает логическое значение, и findbugs будет запрашивать его, если вы не используете переменную. Также это не приятно ...mkDir()
возвращает только true, еслиmkDir()
создает его. Если dir существует, он возвращает false, поэтому для проверки созданного dir вызывайте, толькоexists()
еслиmkDir()
return false.assertThat()
проверяет результат и завершается неудачно, еслиexists()
возвращает false. ofc вы можете использовать другие вещи для обработки несозданного каталога.источник
источник
Вы также можете обратиться к функции makdir () для создания нового каталога в папке, где вы хотите.
источник
makdir
. Если вы имели в видуmkdir
, как это добавить что-либо к существующим ответам?