Jak stworzyć katalog w Javie?

386

Jak mogę utworzyć katalog / folder?

Raz przetestowałem System.getProperty("user.home");

Muszę utworzyć katalog (nazwa katalogu „nowy folder”) tylko wtedy, gdy nowy folder nie istnieje.

Jimmy
źródło
24
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.

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

Przestarzałe:

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");  
    }
}
Jigar Joshi
źródło
240
-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
new File("/path/directory").mkdirs();

Tutaj „katalog” to nazwa katalogu, który chcesz utworzyć / istnieć.

Bozho
źródło
30
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.
Avinash Raj,
1
@ 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
Xerus,
146

Z Javą 7 możesz korzystać Files.createDirectories().

Na przykład:

Files.createDirectories(Paths.get("/path/to/directory"));
Benoit Blanchon
źródło
12
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ć
wyjątku
@chrips Lepiej to zrobić directory.toPath().
Ruslan Stelmachenko
37

Możesz wypróbować FileUtils # forceMkdir

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

Ta biblioteka ma wiele przydatnych funkcji.

ahvargas
źródło
1
Znacznie lepiej niż czysty mkdir: obsługuje współbieżność, sprawdza, czy operacja się powiodła, sprawdza, czy katalog (nie plik!) Istnieje.
Andrey
28

mkdir vs mkdirs


Jeśli chcesz utworzyć pojedynczy katalog, użyj mkdir

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

Jeśli chcesz utworzyć hierarchię struktury folderów, użyj mkdirs

 new File("/path/directory").mkdirs();
Buru
źródło
21
  1. Utwórz pojedynczy katalog.

    new File("C:\\Directory1").mkdir();
  2. Utwórz razem katalog o nazwie „Directory2 i wszystkie jego podkatalogi” Sub2 ″ i „Sub-Sub2 ″.

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

Źródło: ten idealny samouczek , znajdziesz także przykład użycia.

Mouna
źródło
14

W przypadku wersji Java 7 i nowszych:

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

Nie ma potrzeby sprawdzania istnienia katalogu lub pliku przed utworzeniem z javadocs createDirectories :

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.

groo
źródło
7

Poniższa metoda powinna zrobić, co chcesz, tylko upewnij się, że sprawdzasz wartość zwracaną przez 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();
    }
}
Jon Freedman
źródło
2
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.

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");
        }
    }
}
wynik
źródło
3
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;

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!");
            }
        }

    }
}
Program-Me-Rev
źródło
4

Cóż, aby utworzyć katalog / folder w java, mamy dwie metody

Tutaj metoda makedirectory tworzy pojedynczy katalog, jeśli nie istnieje.

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

I

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

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/

siedmiodniowa żałoba
źródło
3

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:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }
Matt Bonness
źródło
2

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 = 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");  }
Stefano Castagnino
źródło
0

Ta funkcja umożliwia utworzenie katalogu w katalogu osobistym użytkownika.

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");
    }
}
Boubakr
źródło
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
0

jeśli chcesz mieć pewność, że został utworzony, to:

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()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.

L0wacska
źródło
-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();
       }

    }
}
Fathah Rehman P.
źródło
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
-7

Możesz także odwołać się do funkcji makdir () w celu utworzenia nowego katalogu w wybranym folderze.

bieg
źródło
9
Nie ma żadnej metody o nazwie makdir. Jeśli miałeś na myśli mkdir, w jaki sposób to coś dodaje do istniejących odpowiedzi?
Ted Hopp