¿Cómo crear un directorio en Java?

387

¿Cómo creo un directorio / carpeta?

Una vez que he probado System.getProperty("user.home");

Tengo que crear un directorio (nombre de directorio "nueva carpeta") si y solo si la nueva carpeta no existe.

palanqueta
fuente
24
por favor revise su selección de la respuesta correcta. La solución propuesta por JigarJoshi es engañosa. No aborda el problema correctamente (ver mi comentario). La solución (simple) propuesta por Bozho es mucho mejor.
mwhs
mkdirEs idempotente en Java. La implementación verificará si el directorio existe para usted y solo lo creará si no existe.
mwhs

Respuestas:

461

Después de ~ 7 años, lo actualizaré para mejorar el enfoque sugerido por Bozho.

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

Obsoleto:

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
fuente
241
-1: Esa es realmente una técnica realmente mala para crear un directorio. El acceso al FS no está reservado a un recurso dedicado. Entre if(!theDir.exists())y theDir.mkdir()el estado podría haber cambiado, así como también podría cambiar entre no crear el directorio (debido a la existsdevolución true) y necesitarlo. El resultado del método existsnunca debe usarse para decidir si crear un directorio o no. Simplemente llame mkdir, no se lanzará ninguna excepción si ya existe.
mwhs
44
@mwhs Entiendo que es mejor no verificar el directorio, pero no entiendo su justificación (segunda parte). ¿No puede cambiar el estado entre llamar mkdiry necesitar el directorio también? Supongo que quiso decir que algún otro proceso elimina el directorio.
Episodex
2
@Episodex Los directorios son recursos compartidos. Simplemente no use la solución anterior, está mal por diferentes razones. No está claro cómo la OP pudo haber pensado que esta es la respuesta correcta. Si desea afirmaciones sobre los recursos de E / S, debe usar bloqueos, no booleanos.
mwhs
44
@mhws Sé que esta publicación tiene un par de meses, pero si miras la mkdirsimplementación, desde el código fuente, lo primero que se llama es if (exists()) { return false; }. La implementación en sí misma verifica primero para ver si el directorio ya existe, por lo que la única razón por la que esta respuesta tiene la culpa, tal vez, es verificar esa condición 2x. No es tan malo como pretendes que sea.
Michael Hogenson
55
A partir de Java 7, probablemente debería usar los métodos Filescomo en la respuesta más reciente de Benoit Blanchon. (Esta respuesta parece haber sido escrita antes de Java 7.)
Brick
504
new File("/path/directory").mkdirs();

Aquí "directorio" es el nombre del directorio que desea crear / existir.

Bozho
fuente
30
Respuesta mucho mejor que la seleccionada como la correcta por el OP. Comprobar la existencia del directorio antes de crearlo debería convertirse en un antipatrón bien conocido.
mwhs
77
¿Qué pasa si el directorio ya existe? Haría sobrescribir? o saltear el proceso.
Avinash Raj
1
@Tascalator no está claro en la documentación, ¿puede elaborarlo? También la respuesta debe complementarse con la respuesta a la what if the directory is already exists? It would do overwriting? or skip the process.pregunta.
mrgloom
3
está claro:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus
147

Con Java 7, puedes usar Files.createDirectories() .

Por ejemplo:

Files.createDirectories(Paths.get("/path/to/directory"));
Benoit Blanchon
fuente
12
Creo que esta opción no existía en el momento de las preguntas y respuestas originales, pero creo que esta debería ser la respuesta en el futuro.
Brick
66
También sería bueno tener en cuenta que:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS
Gracias por señalar la diferencia por cierto createDirectory y createDirectories. Me parece una mala elección de nombres.
seinecle
(2019) utilicé Files.createDirectory (Paths.get (directory.toString ())); donde directorio es un objeto de archivo. No te olvides de atrapar tu IOException
chrips
@chrips Es mejor hacerlo directory.toPath()entonces.
Ruslan Stelmachenko
37

Puedes probar FileUtils # forceMkdir

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

Esta biblioteca tiene muchas funciones útiles.

ahvargas
fuente
1
Mucho mejor que los mkdirs puros: maneja la concurrencia, verifica si la operación tuvo éxito, verifica si el directorio (¡no es un archivo!) Existe.
Andrey
29

mkdir vs mkdirs


Si desea crear un solo directorio, use mkdir

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

Si desea crear una jerarquía de estructura de carpetas, use mkdirs

 new File("/path/directory").mkdirs();
Buru
fuente
22
  1. Crea un solo directorio.

    new File("C:\\Directory1").mkdir();
  2. Cree un directorio llamado "Directorio2 y todos sus subdirectorios" Sub2 "y" Sub-Sub2 "juntos.

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

Fuente: este tutorial perfecto , también encontrarás un ejemplo de uso.

Mouna
fuente
15

Para java 7 y superior:

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

Parece innecesario verificar la existencia del directorio o archivo antes de crear, desde createDirectories javadocs :

Crea un directorio creando primero todos los directorios principales no existentes. A diferencia del método createDirectory, no se genera una excepción si el directorio no se pudo crear porque ya existe. El parámetro attrs es un atributo de archivo opcional para establecer atómicamente al crear los directorios inexistentes. Cada atributo de archivo se identifica por su nombre. Si se incluye más de un atributo del mismo nombre en la matriz, se ignorarán todos menos el último caso.

Si este método falla, puede hacerlo después de crear algunos, pero no todos, los directorios principales.

groo
fuente
7

El siguiente método debe hacer lo que desee, solo asegúrese de verificar el valor de retorno 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
fuente
2
Como se menciona en el comentario de @mwhs sobre la respuesta de Jigar Joshi, verificar la existencia primero no solo no es necesario sino que es una mala idea.
Bdoserror
4

Aunque esta pregunta ha sido respondida. Me gustaría poner algo extra, es decir, si existe un archivo con el nombre del directorio que está intentando crear, entonces debería generar un error. Para futuros visitantes.

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");
        }
    }
}
Puntuación
fuente
3
Como se menciona en el comentario de @mwhs sobre la respuesta de Jigar Joshi, verificar la existencia primero no solo no es necesario sino que es una mala idea.
Bdoserror
4

Limpio y ordenado:

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
fuente
4

Bueno, para crear un directorio / carpeta en Java tenemos dos métodos

Aquí el método makedirectory crea un directorio único si no existe.

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

Y

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

Aquí el método makedirectories creará todos los directorios que faltan en la ruta que representa el objeto de archivo.

Por ejemplo, consulte el enlace a continuación (explicado muy bien). ¡¡Espero eso ayude!! https://www.flowerbrackets.com/create-directory-java-program/

Shiva
fuente
3

Solo quería señalar a todos los que llaman File.mkdir()o File.mkdirs()tener cuidado de que el Fileobjeto sea un directorio y no un archivo. Por ejemplo, si solicita mkdirs()la ruta /dir1/dir2/file.txt, creará una carpeta con el nombre file.txtque probablemente no sea el que deseaba. Si está creando un nuevo archivo y también desea crear automáticamente carpetas principales, puede hacer algo como esto:

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

Así funciona para mí hacer un solo directorio o más o ellos: necesita importar java.io.File;
/ * ingrese el código a continuación para agregar un directorio dietético dir1 o verifique si existe dir1, si no es así, así que créelo y diríjalo con dir2 y 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
fuente
0

Esta función le permite crear un directorio en el directorio de inicio del usuario.

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
fuente
Como se menciona en el comentario de @mwhs sobre la respuesta de Jigar Joshi, verificar la existencia primero no solo no es necesario sino que es una mala idea.
Bdoserror
0

si quieres estar seguro de que está creado, entonces esto:

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

porque mkDir()devuelve un booleano, y findbugs lo llorará si no usa la variable. Además no es agradable ...

mkDir()devuelve solo verdadero si lo mkDir()crea. Si el directorio existe, devuelve falso, por lo que para verificar el directorio que creó, solo llame exists()si mkDir()devuelve falso.

assertThat()verificará el resultado y fallará si exists()devuelve falso. ofc puede usar otras cosas para manejar el directorio no creado.

l0wacska
fuente
-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
fuente
Como se menciona en el comentario de @mwhs sobre la respuesta de Jigar Joshi, verificar la existencia primero no solo no es necesario sino que es una mala idea.
Bdoserror
-7

También puede consultar la función makdir () para crear un nuevo directorio en una carpeta donde desee.

arun
fuente
99
No hay un método nombrado makdir. Si quisiste decir mkdir, ¿cómo agrega esto algo a las respuestas existentes?
Ted Hopp