zapoznaj się z wyborem poprawnej odpowiedzi. Rozwiązanie zaproponowane przez JigarJoshi jest mylące. Nie rozwiązuje problemu poprawnie (patrz mój komentarz). (Proste) rozwiązanie zaproponowane przez Bozho jest znacznie lepsze.
mwhs
mkdirjest idempotentny w java. Implementacja sprawdzi, czy katalog istnieje dla Ciebie i utworzy go tylko wtedy, gdy nie istnieje.
mwhs
Odpowiedzi:
460
Po ~ 7 latach zaktualizuję go, aby lepiej podchodził do niego Bozho.
newFile("/path/directory").mkdirs();
Przestarzałe:
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: To naprawdę zła technika tworzenia katalogu. Dostęp do FS nie jest zarezerwowany dla dedykowanego zasobu. Pomiędzy if(!theDir.exists())i theDir.mkdir()stan mógł ulec zmianie, a także mógł zmieniać się między nie tworzeniem katalogu (z powodu existspowrotu true) a potrzebowaniem go. Wynik tej metody existsnigdy nie powinien być wykorzystywany do decydowania, czy należy utworzyć katalog, czy nie. Wystarczy zadzwonić mkdir, żaden wyjątek nie zostanie zgłoszony, jeśli już istnieje.
mwhs
4
@mwhs Rozumiem, że lepiej nie sprawdzać katalogu, ale nie rozumiem twojego uzasadnienia (druga część). Czy status nie może również zmieniać się między połączeniem mkdira potrzebą katalogu? Zakładam, że miałeś na myśli, że jakiś inny proces usuwa katalog.
Episodex,
2
@Episodex Katalogi są zasobami współdzielonymi. Po prostu nie używaj powyższego rozwiązania, jest ono niewłaściwe z różnych powodów. Niejasne, jak organizacja producentów mogła pomyśleć, że to poprawna odpowiedź. Jeśli chcesz twierdzić o zasobach IO, musisz użyć blokad, a nie boolanów.
mws
44
@mhws Wiem, że ten post ma kilka miesięcy, ale jeśli spojrzysz na mkdirsimplementację, z kodu źródłowego, pierwszą rzeczą, która zostanie wywołana, jest if (exists()) { return false; }. Sama implementacja sprawdza najpierw, czy katalog już istnieje, więc jedyną wadą tej odpowiedzi może być sprawdzenie tego warunku 2x. Nie tak źle, jak się wydaje.
Michael Hogenson
5
Począwszy od wersji Java 7, prawdopodobnie powinieneś używać tych metod Filesjak w najnowszej odpowiedzi Benoit Blanchon. (Wydaje się, że odpowiedź została napisana przed Javą 7).
Brick
504
newFile("/path/directory").mkdirs();
Tutaj „katalog” to nazwa katalogu, który chcesz utworzyć / istnieć.
Znacznie lepsza odpowiedź niż ta wybrana jako poprawna przez PO. Sprawdzanie istnienia katalogu przed jego utworzeniem powinno stać się znanym anty-wzorcem.
mwhs
7
co jeśli katalog już istnieje? Czy to nadpisywanie? lub pomiń proces.
@ Tascalator nie jest jasne z dokumentacji, czy możesz to opracować? Odpowiedź należy również uzupełnić odpowiedzią na what if the directory is already exists? It would do overwriting? or skip the process.pytanie.
mrgloom
3
jasne jest:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Myślę, że ta opcja nie istniała w czasie pierwotnych pytań i odpowiedzi, ale myślę, że powinna to być odpowiedź na przyszłość.
Cegła
6
Warto również zauważyć, że:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS,
Dziękujemy za wskazanie różnicy między createDirectory i createDirectories. Uważam, że to zły wybór nazw.
seinecle
(2019) Użyłem Files.createDirectory (Paths.get (directory.toString ())); gdzie katalog jest obiektem File. Nie zapomnij złapać
Tworzy katalog, tworząc najpierw wszystkie nieistniejące katalogi nadrzędne. W przeciwieństwie do metody createDirectory wyjątek nie jest zgłaszany, jeśli nie można utworzyć katalogu, ponieważ już istnieje. Parametr attrs jest opcjonalnym atrybutem pliku do atomowego ustawienia podczas tworzenia nieistniejących katalogów. Każdy atrybut pliku jest identyfikowany przez jego nazwę. Jeśli w tablicy znajduje się więcej niż jeden atrybut o tej samej nazwie, wówczas wszystkie wystąpienia oprócz ostatniego są ignorowane.
Jeśli ta metoda zawiedzie, może to zrobić po utworzeniu niektórych, ale nie wszystkich katalogów nadrzędnych.
Jak wspomniano w komentarzu @mwhs do odpowiedzi Jigara Joshi, najpierw sprawdzenie istnienia nie jest nie tylko konieczne, ale wręcz złym pomysłem.
Bdoserror
4
Chociaż odpowiedź na to pytanie. Chciałbym dodać coś dodatkowego, tzn. Jeśli istnieje plik z nazwą katalogu, który próbujesz utworzyć, powinien on wyświetlić błąd. Dla przyszłych gości.
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");}}}
Jak wspomniano w komentarzu @mwhs do odpowiedzi Jigara Joshi, najpierw sprawdzenie istnienia nie jest nie tylko konieczne, ale wręcz złym pomysłem.
Bdoserror
4
Schludny i czysty:
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!");}}}}
Chciałem tylko wskazać wszystkim dzwoniącym File.mkdir()lub File.mkdirs()być ostrożnym, ponieważ Fileobiekt jest katalogiem, a nie plikiem. Na przykład, jeśli wywołasz mkdirs()ścieżkę /dir1/dir2/file.txt, utworzy folder o nazwie, file.txtktóra prawdopodobnie nie jest tym, czego chciałeś. Jeśli tworzysz nowy plik, a także chcesz automatycznie tworzyć foldery nadrzędne, możesz zrobić coś takiego:
W ten sposób dla mnie działa jeden katalog lub więcej: albo trzeba zaimportować java.io.File;
/ * wprowadź poniższy kod, aby dodać diectory dir1 lub sprawdź, czy istnieje dir1, jeśli nie, więc utwórz go tak samo z dir2 i 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()zwraca wartość logiczną, a findbugs będzie płakać, jeśli nie użyjesz zmiennej. Również to nie jest miłe ...
mkDir()zwraca tylko prawdę, jeśli mkDir()ją tworzy. Jeśli katalog istnieje, zwraca wartość false, więc aby zweryfikować utworzony katalog, należy wywoływać tylko, exists()jeśli mkDir()zwraca false.
assertThat()sprawdzi wynik i nie powiedzie się, jeśli exists()zwróci false. Ofc możesz używać innych rzeczy do obsługi nie utworzonego katalogu.
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
jest idempotentny w java. Implementacja sprawdzi, czy katalog istnieje dla Ciebie i utworzy go tylko wtedy, gdy nie istnieje.Odpowiedzi:
Po ~ 7 latach zaktualizuję go, aby lepiej podchodził do niego Bozho.
Przestarzałe:
źródło
if(!theDir.exists())
itheDir.mkdir()
stan mógł ulec zmianie, a także mógł zmieniać się między nie tworzeniem katalogu (z powoduexists
powrotutrue
) a potrzebowaniem go. Wynik tej metodyexists
nigdy nie powinien być wykorzystywany do decydowania, czy należy utworzyć katalog, czy nie. Wystarczy zadzwonićmkdir
, żaden wyjątek nie zostanie zgłoszony, jeśli już istnieje.mkdir
a potrzebą katalogu? Zakładam, że miałeś na myśli, że jakiś inny proces usuwa katalog.mkdirs
implementację, z kodu źródłowego, pierwszą rzeczą, która zostanie wywołana, jestif (exists()) { return false; }
. Sama implementacja sprawdza najpierw, czy katalog już istnieje, więc jedyną wadą tej odpowiedzi może być sprawdzenie tego warunku 2x. Nie tak źle, jak się wydaje.Files
jak w najnowszej odpowiedzi Benoit Blanchon. (Wydaje się, że odpowiedź została napisana przed Javą 7).Tutaj „katalog” to nazwa katalogu, który chcesz utworzyć / istnieć.
źródło
what if the directory is already exists? It would do overwriting? or skip the process.
pytanie.Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Z Javą 7 możesz korzystać
Files.createDirectories()
.Na przykład:
źródło
Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
directory.toPath()
.Możesz wypróbować FileUtils # forceMkdir
Ta biblioteka ma wiele przydatnych funkcji.
źródło
mkdir vs mkdirs
Jeśli chcesz utworzyć pojedynczy katalog, użyj
mkdir
Jeśli chcesz utworzyć hierarchię struktury folderów, użyj
mkdirs
źródło
Utwórz pojedynczy katalog.
Utwórz razem katalog o nazwie „Directory2 i wszystkie jego podkatalogi” Sub2 ″ i „Sub-Sub2 ″.
Źródło: ten idealny samouczek , znajdziesz także przykład użycia.
źródło
W przypadku wersji Java 7 i nowszych:
Nie ma potrzeby sprawdzania istnienia katalogu lub pliku przed utworzeniem z javadocs createDirectories :
źródło
Poniższa metoda powinna zrobić, co chcesz, tylko upewnij się, że sprawdzasz wartość zwracaną przez mkdir () / mkdirs ()
źródło
Chociaż odpowiedź na to pytanie. Chciałbym dodać coś dodatkowego, tzn. Jeśli istnieje plik z nazwą katalogu, który próbujesz utworzyć, powinien on wyświetlić błąd. Dla przyszłych gości.
źródło
Schludny i czysty:
źródło
Cóż, aby utworzyć katalog / folder w java, mamy dwie metody
Tutaj metoda makedirectory tworzy pojedynczy katalog, jeśli nie istnieje.
I
Tutaj metoda makedirectories utworzy wszystkie katalogi, których brakuje w ścieżce reprezentowanej przez obiekt pliku.
Na przykład zapoznaj się z linkiem poniżej (bardzo dobrze wyjaśnione). Mam nadzieję, że to pomoże!! https://www.flowerbrackets.com/create-directory-java-program/
źródło
Chciałem tylko wskazać wszystkim dzwoniącym
File.mkdir()
lubFile.mkdirs()
być ostrożnym, ponieważFile
obiekt jest katalogiem, a nie plikiem. Na przykład, jeśli wywołaszmkdirs()
ścieżkę/dir1/dir2/file.txt
, utworzy folder o nazwie,file.txt
która prawdopodobnie nie jest tym, czego chciałeś. Jeśli tworzysz nowy plik, a także chcesz automatycznie tworzyć foldery nadrzędne, możesz zrobić coś takiego:źródło
W ten sposób dla mnie działa jeden katalog lub więcej: albo trzeba zaimportować java.io.File;
/ * wprowadź poniższy kod, aby dodać diectory dir1 lub sprawdź, czy istnieje dir1, jeśli nie, więc utwórz go tak samo z dir2 i dir3 * /
źródło
Ta funkcja umożliwia utworzenie katalogu w katalogu osobistym użytkownika.
źródło
jeśli chcesz mieć pewność, że został utworzony, to:
beacuse
mkDir()
zwraca wartość logiczną, a findbugs będzie płakać, jeśli nie użyjesz zmiennej. Również to nie jest miłe ...mkDir()
zwraca tylko prawdę, jeślimkDir()
ją tworzy. Jeśli katalog istnieje, zwraca wartość false, więc aby zweryfikować utworzony katalog, należy wywoływać tylko,exists()
jeślimkDir()
zwraca false.assertThat()
sprawdzi wynik i nie powiedzie się, jeśliexists()
zwróci false. Ofc możesz używać innych rzeczy do obsługi nie utworzonego katalogu.źródło
źródło
Możesz także odwołać się do funkcji makdir () w celu utworzenia nowego katalogu w wybranym folderze.
źródło
makdir
. Jeśli miałeś na myślimkdir
, w jaki sposób to coś dodaje do istniejących odpowiedzi?