Come creare una directory in Java?


387

Come posso creare la directory / cartella?

Una volta ho provato System.getProperty("user.home");

Devo creare una directory (nome directory "nuova cartella") se e solo se non esiste una nuova cartella.


24
si prega di rivedere la selezione della risposta corretta. La soluzione proposta da JigarJoshi è fuorviante. Non risolve il problema correttamente (vedi il mio commento). La (semplice) soluzione proposta da Bozho è molto migliore.
martedì

mkdirè idempotente in Java. L'implementazione controllerà se la directory esiste per te e la creerà solo se non esiste.
mwhs

Risposte:


461

Dopo ~ 7 anni, lo aggiornerò per un migliore approccio suggerito da Bozho.

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

deprecato:

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: Questa è in realtà una brutta tecnica per creare una directory. L'accesso a FS non è riservato a una risorsa dedicata. Tra if(!theDir.exists())e theDir.mkdir()lo stato potrebbe essere cambiato, così come potrebbe cambiare tra la non creazione della directory (a causa del existsritorno true) e la necessità di essa. Il risultato del metodo existsnon dovrebbe mai essere usato per decidere se creare o meno una directory. Basta chiamare mkdir, nessuna eccezione verrà generata se esiste già.
martedì

4
@mwhs Capisco che è meglio non controllare la directory ma non capisco la tua giustificazione (seconda parte). Lo stato non può cambiare anche tra chiamata mkdire necessità della directory? Presumo che intendessi dire che un altro processo elimina la directory.
Episodex,

2
Le directory @Episodex sono risorse condivise. Basta non usare la soluzione di cui sopra, è sbagliato per diversi motivi. Non è chiaro come l'OP avrebbe potuto pensare che questa fosse la risposta corretta. Se vuoi affermazioni sulle risorse IO, devi usare i blocchi, non i booleani.
mwhs

44
@mhws So che questo post ha un paio di mesi, ma se guardi l' mkdirsimplementazione, dal codice sorgente, la prima cosa che viene chiamata è if (exists()) { return false; }. L'implementazione stessa controlla per prima cosa se la directory esiste già, quindi l'unica cosa per cui questa risposta è in errore, forse, sta controllando quella condizione 2x. Non così male come lo stai immaginando di essere.
Michael Hogenson,

5
A partire da Java 7, dovresti probabilmente usare i metodi Filescome nella risposta più recente di Benoit Blanchon. (Questa risposta sembra essere stata scritta prima di Java 7.)
Brick

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

Qui "directory" è il nome della directory che si desidera creare / esistere.


30
Risposta molto migliore di quella selezionata come corretta dall'OP. Controllare l'esistenza della directory prima di crearla dovrebbe diventare un anti-pattern ben noto.
martedì

7
cosa succede se la directory è già esistente? Farebbe sovrascrivere? o saltare il processo.
Avinash Raj,


1
@Tascalator non è chiaro dalla documentazione che puoi elaborare? Anche la risposta dovrebbe essere integrata con la risposta alla what if the directory is already exists? It would do overwriting? or skip the process.domanda.
MrGloom,

3
è chiaro:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus l'

147

Con Java 7, puoi usare Files.createDirectories().

Per esempio:

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

12
Penso che questa opzione non esistesse al momento delle domande e risposte originali, ma questa dovrebbe essere la risposta per il futuro, credo.
Brick

6
Sarebbe anche bene notare che:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS,

Grazie per indicare la differenza tra createDirectory e createDirectories. Trovo che sia una cattiva scelta di denominazione.
seinecle

(2019) Ho usato Files.createDirectory (Paths.get (directory.toString ())); dove directory è un oggetto File. Non dimenticare di catturare la tua IOException
chrips del

@chrips È meglio farlo directory.toPath()allora.
Ruslan Stelmachenko,

37

Puoi provare FileUtils # forceMkdir

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

Questa libreria ha molte funzioni utili.


1
Molto meglio di mkdirs puri: gestisce la concorrenza, controlla se l'operazione è riuscita, controlla se esiste la directory (non un file!).
Andrey,

29

mkdir vs mkdirs


Se si desidera creare una singola directory utilizzare mkdir

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

Se si desidera creare una gerarchia della struttura delle cartelle, utilizzare mkdirs

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

22
  1. Crea una singola directory.

    new File("C:\\Directory1").mkdir();
  2. Creare una directory denominata “Directory2 e tutte le sue sottodirectory“ Sub2 ″ e “Sub-Sub2 ″ insieme.

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

Fonte: questo tutorial perfetto , trovi anche un esempio di utilizzo.


15

Per java 7 e versioni successive:

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

Non sembra necessario verificare l'esistenza della directory o del file prima di creare, da createDirectories javadocs :

Crea una directory creando prima tutte le directory principali inesistenti. A differenza del metodo createDirectory, non viene generata un'eccezione se non è stato possibile creare la directory perché esiste già. Il parametro attrs è attributi di file facoltativi da impostare atomicamente durante la creazione delle directory inesistenti. Ogni attributo di file è identificato dal suo nome. Se nell'array è incluso più di un attributo con lo stesso nome, vengono ignorati tutti tranne l'ultima occorrenza.

Se questo metodo fallisce, può farlo dopo aver creato alcune, ma non tutte, le directory principali.


7

Il seguente metodo dovrebbe fare quello che vuoi, assicurati di controllare il valore di ritorno di 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
Come menzionato nel commento di @mwhs sulla risposta di Jigar Joshi, verificare prima l'esistenza non è solo non necessario ma in realtà è una cattiva idea.
Bdoserror,

4

Sebbene questa domanda abbia avuto risposta. Vorrei aggiungere qualcosa in più, ad esempio se esiste un file con il nome della directory che si sta tentando di creare, ciò dovrebbe richiedere un errore. Per i futuri visitatori.

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
Come menzionato nel commento di @mwhs sulla risposta di Jigar Joshi, verificare prima l'esistenza non è solo non necessario ma in realtà è una cattiva idea.
Bdoserror,

4

Ordinato e pulito:

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

Bene per creare Directory / cartella in Java abbiamo due metodi

Qui il metodo makedirectory crea una singola directory se non esiste.

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

E

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

Qui il metodo makedirectories creerà tutte le directory mancanti nel percorso rappresentato dall'oggetto file.

Ad esempio fare riferimento al link di seguito (spiegato molto bene). Spero che sia d'aiuto!! https://www.flowerbrackets.com/create-directory-java-program/


3

Volevo solo far notare a tutti coloro che chiamavano File.mkdir()o File.mkdirs()fare attenzione, l' Fileoggetto è una directory e non un file. Ad esempio, se si chiama mkdirs()il percorso /dir1/dir2/file.txt, verrà creata una cartella con il nome file.txtche probabilmente non è quello desiderato. Se stai creando un nuovo file e desideri anche creare automaticamente cartelle principali, puoi fare qualcosa del genere:

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

2

In questo modo funziona per me fare una sola directory o più o loro: è necessario importare java.io.File;
/ * inserisci il codice qui sotto per aggiungere una directory di1 dir1 o controlla se esiste dir1, in caso contrario, quindi crealo e lo stesso con dir2 e 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

Questa funzione consente di creare una directory nella home directory dell'utente.

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

Come menzionato nel commento di @mwhs sulla risposta di Jigar Joshi, verificare prima l'esistenza non è solo non necessario ma in realtà è una cattiva idea.
Bdoserror,

0

se vuoi essere sicuro che sia stato creato, allora questo:

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();
}

perché mkDir()restituisce un valore booleano e findbugs piangerà per questo se non si utilizza la variabile. Inoltre non è carino ...

mkDir()restituisce vero solo se lo mkDir()crea. Se la directory esiste, restituisce false, quindi per verificare la directory che hai creato, chiama solo exists()se mkDir()restituisci false.

assertThat()controlla il risultato e fallisce se exists()restituisce false. ofc puoi usare altre cose per gestire la directory non creata.


-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();
       }

    }
}

Come menzionato nel commento di @mwhs sulla risposta di Jigar Joshi, verificare prima l'esistenza non è solo non necessario ma in realtà è una cattiva idea.
Bdoserror,

-7

Puoi anche fare riferimento alla funzione makdir () per creare una nuova directory in una cartella dove vuoi.


9
Non esiste un metodo chiamato makdir. Se intendevi mkdir, come si aggiunge qualcosa alle risposte esistenti?
Ted Hopp,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.