Comment créer un répertoire en Java?

387

Comment créer un répertoire / dossier?

Une fois que j'ai testé System.getProperty("user.home");

Je dois créer un répertoire (nom de répertoire "nouveau dossier") si et seulement si un nouveau dossier n'existe pas.

Jimmy
la source
24
veuillez revoir votre sélection de la bonne réponse. La solution proposée par JigarJoshi est trompeuse. Il ne résout pas le problème correctement (voir mon commentaire). La solution (simple) proposée par Bozho est bien meilleure.
mwhs
mkdirest idempotent en java. L'implémentation vérifiera si le répertoire existe pour vous et ne le créera que s'il n'existe pas.
mwhs

Réponses:

461

Après environ 7 ans, je le mettrai à jour pour une meilleure approche suggérée par Bozho.

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

Obsolète:

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
la source
241
-1: C'est en fait une très mauvaise technique pour créer un répertoire. L'accès au FS n'est pas réservé à une ressource dédiée. Entre if(!theDir.exists())et theDir.mkdir()l'état pourrait avoir changé, ainsi que changer entre ne pas créer le répertoire (à cause du existsretour true) et en avoir besoin. Le résultat de la méthode existsne doit jamais être utilisé pour décider de créer ou non un répertoire. Appelez simplement mkdir, aucune exception ne sera levée si elle existe déjà.
mwhs
4
@mwhs Je comprends qu'il vaut mieux ne pas chercher le répertoire mais je ne comprends pas votre justification (deuxième partie). Le statut ne peut-il pas également changer entre appeler mkdiret avoir besoin du répertoire? Je suppose que vous vouliez dire qu'un autre processus supprime le répertoire.
Episodex
2
Les répertoires @Episodex sont des ressources partagées. N'utilisez simplement pas la solution ci-dessus, elle est incorrecte pour différentes raisons. On ne sait pas comment le PO aurait pu penser que c'était la bonne réponse. Si vous voulez des assertions sur les ressources d'E / S, vous devez utiliser des verrous, pas des booléens.
mwhs
44
@mhws Je sais que ce message a quelques mois mais si vous regardez l' mkdirsimplémentation, à partir du code source, la toute première chose qui est appelée est if (exists()) { return false; }. L'implémentation elle-même vérifie d'abord si le répertoire existe déjà, donc la seule chose à laquelle cette réponse est en défaut, peut-être, est de vérifier cette condition 2x. Pas aussi mauvais que vous le prétendez.
Michael Hogenson
5
Depuis Java 7, vous devriez probablement utiliser les méthodes Filescomme dans la réponse la plus récente de Benoit Blanchon. (Cette réponse semble avoir été écrite avant Java 7.)
Brick
504
new File("/path/directory").mkdirs();

Ici "répertoire" est le nom du répertoire que vous souhaitez créer / exister.

Bozho
la source
30
Meilleure réponse que celle choisie comme bonne par l'OP. Vérifier l'existence du répertoire avant de le créer devrait devenir un anti-modèle bien connu.
mwhs
7
que faire si le répertoire existe déjà? Cela ferait écraser? ou ignorer le processus.
Avinash Raj
3
@AvinashRaj veuillez consulter docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs ()
Tascalator
1
@Tascalator ce n'est pas clair dans la documentation pouvez-vous élaborer? La réponse doit également être complétée par la réponse à la what if the directory is already exists? It would do overwriting? or skip the process.question.
mrgloom
3
c'est clair:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus
147

Avec Java 7, vous pouvez utiliser Files.createDirectories().

Par exemple:

Files.createDirectories(Paths.get("/path/to/directory"));
Benoit Blanchon
la source
12
Je pense que cette option n'existait pas au moment de la Q&R originale, mais cela devrait être la réponse à l'avenir, je pense.
Brick
6
Il serait également bon de noter que:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS
Merci d'avoir souligné la différence entre createDirectory et createDirectories. Je trouve que c'est un mauvais choix de nom.
seinecle
(2019) J'ai utilisé Files.createDirectory (Paths.get (directory.toString ())); où répertoire est un objet File. N'oubliez pas d'attraper votre IOException
chrips le
@chrips Il vaut mieux faire directory.toPath()alors.
Ruslan Stelmachenko
37

Vous pouvez essayer FileUtils # forceMkdir

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

Cette bibliothèque possède de nombreuses fonctions utiles.

ahvargas
la source
1
Beaucoup mieux que des mkdirs purs: gère la concurrence, vérifie si l'opération a réussi, vérifie si le répertoire (pas un fichier!) Existe.
Andrey
29

mkdir vs mkdirs


Si vous souhaitez créer un répertoire unique, utilisez mkdir

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

Si vous souhaitez créer une hiérarchie de structure de dossiers, utilisez mkdirs

 new File("/path/directory").mkdirs();
Buru
la source
22
  1. Créez un répertoire unique.

    new File("C:\\Directory1").mkdir();
  2. Créez un répertoire nommé "Directory2 et tous ses sous-répertoires" Sub2 "et" Sub-Sub2 "ensemble.

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

Source: ce tutoriel parfait , vous trouverez également un exemple d'utilisation.

Mouna
la source
15

Pour java 7 et plus:

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

Il semble inutile de vérifier l'existence du répertoire ou du fichier avant de créer, à partir de javadocs createDirectories :

Crée un répertoire en créant d'abord tous les répertoires parents inexistants. Contrairement à la méthode createDirectory, aucune exception n'est levée si le répertoire n'a pas pu être créé car il existe déjà. Le paramètre attrs est des attributs de fichier facultatifs à définir de manière atomique lors de la création des répertoires inexistants. Chaque attribut de fichier est identifié par son nom. Si plusieurs attributs du même nom sont inclus dans le tableau, tous, sauf la dernière occurrence, sont ignorés.

Si cette méthode échoue, elle peut le faire après avoir créé certains, mais pas tous, des répertoires parents.

groo
la source
7

La méthode suivante doit faire ce que vous voulez, assurez-vous simplement de vérifier la valeur de retour de 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
la source
2
Comme mentionné dans le commentaire de @mwhs sur la réponse de Jigar Joshi, la vérification de l'existence en premier n'est pas seulement nécessaire mais en fait une mauvaise idée.
Bdoserror
4

Bien que cette question ait été répondue. Je voudrais mettre quelque chose en plus, c'est-à-dire s'il existe un fichier avec le nom du répertoire que vous essayez de créer, cela devrait provoquer une erreur. Pour les futurs visiteurs.

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");
        }
    }
}
But
la source
3
Comme mentionné dans le commentaire de @mwhs sur la réponse de Jigar Joshi, la vérification de l'existence en premier n'est pas seulement nécessaire mais en fait une mauvaise idée.
Bdoserror
4

Propre et net:

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
la source
4

Eh bien pour créer un répertoire / dossier en java, nous avons deux méthodes

Ici, la méthode makedirectory crée un répertoire unique s'il n'existe pas.

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

Et

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

Ici, la méthode makedirectories créera tous les répertoires manquants dans le chemin que représente l'objet fichier.

Par exemple, reportez-vous au lien ci-dessous (très bien expliqué). J'espère que cela aide!! https://www.flowerbrackets.com/create-directory-java-program/

Shiva
la source
3

Je voulais juste signaler à tous ceux qui appellent File.mkdir()ou File.mkdirs()faire attention que l' Fileobjet est un répertoire et non un fichier. Par exemple, si vous appelez mkdirs()le chemin /dir1/dir2/file.txt, il créera un dossier avec le nom file.txtqui n'est probablement pas celui que vous vouliez. Si vous créez un nouveau fichier et souhaitez également créer automatiquement des dossiers parents, vous pouvez faire quelque chose comme ceci:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }
Matt Bonness
la source
2

Cela fonctionne pour moi de faire un seul répertoire ou plus ou eux: besoin d'importer java.io.File;
/ * entrez le code ci-dessous pour ajouter un répertoire dir1 ou vérifiez s'il existe dir1, sinon, créez-le ainsi avec dir2 et 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
la source
0

Cette fonction vous permet de créer un répertoire sur le répertoire personnel de l'utilisateur.

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
la source
Comme mentionné dans le commentaire de @mwhs sur la réponse de Jigar Joshi, la vérification de l'existence en premier n'est pas seulement nécessaire mais en fait une mauvaise idée.
Bdoserror
0

si vous voulez être sûr qu'il est créé, alors ceci:

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()retourne un booléen, et findbugs pleurera si vous n'utilisez pas la variable. Aussi ce n'est pas sympa ...

mkDir()renvoie seulement vrai si le mkDir()crée. Si le répertoire existe, il renvoie false, donc pour vérifier le répertoire que vous avez créé, n'appelez que exists()si mkDir()return false.

assertThat()vérifie le résultat et échoue si exists()renvoie faux. ofc vous pouvez utiliser d'autres choses pour gérer le répertoire non créé.

l0wacska
la source
-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
la source
Comme mentionné dans le commentaire de @mwhs sur la réponse de Jigar Joshi, la vérification de l'existence en premier n'est pas seulement nécessaire mais en fait une mauvaise idée.
Bdoserror
-7

Vous pouvez également faire référence à la fonction makdir () pour créer un nouveau répertoire dans un dossier où vous le souhaitez.

arun
la source
9
Il n'y a pas de méthode nommée makdir. Si vous vouliez dire mkdir, comment cela ajoute-t-il quelque chose aux réponses existantes?
Ted Hopp