Como criar um diretório em Java?


387

Como crio diretório / pasta?

Depois de testar System.getProperty("user.home");

Eu tenho que criar um diretório (nome do diretório "nova pasta") se e somente se a nova pasta não existir.


24
revise sua seleção da resposta correta. A solução proposta por JigarJoshi é enganosa. Não resolve o problema corretamente (veja meu comentário). A solução (simples) proposta pelo Bozho é muito melhor.
mwhs

mkdiré idempotente em java. A implementação verificará se o diretório existe para você e somente o criará se ele não existir.
mwhs

Respostas:


461

Após ~ 7 anos, atualizá-lo-ei para uma melhor abordagem, sugerida pelo Bozho.

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

Descontinuada:

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: Essa é realmente uma técnica muito ruim para criar um diretório. O acesso ao FS não está reservado para um recurso dedicado. Entre if(!theDir.exists())e theDir.mkdir()o status poderia ter mudado, assim como entre a não criação do diretório (por causa do existsretorno true) e a necessidade dele. O resultado do método existsnunca deve ser usado para decidir se deseja criar um diretório ou não. Basta ligar mkdir, nenhuma exceção será lançada se ela já existir.
mwhs

4
@mwhs Entendo que é melhor não verificar o diretório, mas não entendo sua justificativa (segunda parte). O status não pode mudar entre chamar mkdire precisar do diretório também? Suponho que você quis dizer que algum outro processo exclui o diretório.
Episodex 17/07/2015

2
Os diretórios @Episodex são recursos compartilhados. Só não use a solução acima, ela está errada por diferentes razões. Não está claro como o OP poderia ter pensado que esta é a resposta correta. Se você deseja asserções sobre recursos de E / S, precisa usar bloqueios, não booleanos.
mwhs

44
@mhws Eu sei que este post tem alguns meses, mas se você observar a mkdirsimplementação, a partir do código-fonte, a primeira coisa que será chamada é if (exists()) { return false; }. A implementação em si verifica primeiro se o diretório já existe, então a única coisa que esta resposta está errada, talvez, é verificar essa condição 2x. Não é tão ruim quanto você está imaginando.
Michael Hogenson

5
No Java 7, você provavelmente deve usar os métodos Filescomo na resposta mais recente de Benoit Blanchon. (Esta resposta parece ter sido escrito antes de Java 7.)
Tijolo

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

Aqui "diretório" é o nome do diretório que você deseja criar / existir.


30
Resposta muito melhor que a selecionada como correta pelo OP. A verificação da existência do diretório antes de criá-lo deve se tornar um anti-padrão bem conhecido.
mwhs

7
e se o diretório já existir? Seria substituir? ou pule o processo.
Avinash Raj


11
@Tascalator não está claro na documentação que você pode elaborar? Também a resposta deve ser complementada com a resposta à what if the directory is already exists? It would do overwriting? or skip the process.pergunta.
mrgloom

3
é claro:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

147

Com o Java 7, você pode usar Files.createDirectories().

Por exemplo:

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

12
Eu acho que essa opção não existia no momento das perguntas e respostas originais, mas essa deveria ser a resposta daqui para frente, eu acho.
tijolo

6
Também seria bom observar que:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS

Obrigado por apontar a diferença entre createDirectory e createDirectories. Acho que é uma má escolha de nome.
seinecle

(2019) Eu usei Files.createDirectory (Paths.get (directory.toString ())); onde diretório é um objeto de arquivo. Não se esqueça de capturar sua IOException
chrips

@chrips É melhor fazer directory.toPath()isso.
Ruslan Stelmachenko

37

Você pode tentar o FileUtils # forceMkdir

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

Esta biblioteca possui muitas funções úteis.


11
Muito melhor que o mkdirs puro: trata da concorrência, verifica se a operação foi bem-sucedida, verifica se o diretório (não um arquivo!) Existe.
Andrey

29

mkdir vs mkdirs


Se você deseja criar um único diretório, use mkdir

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

Se você deseja criar uma hierarquia de estrutura de pastas, use mkdirs

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

22
  1. Crie um único diretório.

    new File("C:\\Directory1").mkdir();
  2. Crie um diretório chamado “Directory2 e todos os seus subdiretórios“ Sub2 ″ e “Sub-Sub2 ″ juntos.

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

Fonte: este tutorial perfeito , você encontra também um exemplo de uso.


15

Para java 7 e superior:

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

Parece desnecessário verificar a existência do diretório ou arquivo antes de criar, a partir dos javadocs createDirectories :

Cria um diretório criando todos os diretórios pai inexistentes primeiro. Diferente do método createDirectory, uma exceção não será lançada se o diretório não puder ser criado porque já existe. O parâmetro attrs é um atributo de arquivo opcional para definir atomicamente ao criar os diretórios inexistentes. Cada atributo de arquivo é identificado por seu nome. Se mais de um atributo com o mesmo nome estiver incluído na matriz, todos, exceto a última ocorrência, serão ignorados.

Se esse método falhar, poderá ser feito após a criação de alguns, mas não todos, dos diretórios pai.


7

O método a seguir deve fazer o que você deseja, apenas verifique o 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();
    }
}

2
Como mencionado no comentário de @mwhs na resposta de Jigar Joshi, verificar a existência primeiro não é apenas não necessário, mas também uma péssima idéia.
Bdoserror

4

Embora esta pergunta tenha sido respondida. Gostaria de colocar algo extra, ou seja, se existe um arquivo com o nome do diretório que você está tentando criar, isso deve gerar um erro. 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");
        }
    }
}

3
Como mencionado no comentário de @mwhs na resposta de Jigar Joshi, verificar a existência primeiro não é apenas não necessário, mas também uma péssima idéia.
Bdoserror

4

Arrumado e limpo:

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

Bem, para criar diretório / pasta em java, temos dois métodos

Aqui, o método makedirectory cria um diretório único, se ele não existir.

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

E

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

Aqui, o método makedirectories criará todos os diretórios ausentes no caminho que o objeto de arquivo representa.

Por exemplo, consulte o link abaixo (explicado muito bem). Espero que ajude!! https://www.flowerbrackets.com/create-directory-java-program/


3

Só queria apontar para todos que ligavam File.mkdir()ou File.mkdirs()ter cuidado com o Fileobjeto é um diretório e não um arquivo. Por exemplo, se você chamar mkdirs()o caminho /dir1/dir2/file.txt, ele criará uma pasta com o nome file.txtque provavelmente não é o que você queria. Se você estiver criando um novo arquivo e também desejar criar automaticamente pastas pai, poderá fazer algo assim:

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

2

Assim funciona para mim um diretório único ou mais ou mais: precisa importar java.io.File;
/ * digite o código abaixo para adicionar um diretório dir1 ou verifique se existe dir1, se não existir, portanto, crie o mesmo com 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

Esta função permite criar um diretório no diretório inicial do usuário.

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

Como mencionado no comentário de @mwhs na resposta de Jigar Joshi, verificar a existência primeiro não é apenas não necessário, mas também uma péssima idéia.
Bdoserror

0

se você quiser ter certeza de que foi criado, então:

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() retorna um booleano, e os findbugs irão chorar por ele se você não usar a variável. Também não é bom ...

mkDir()retorna apenas verdadeiro se o mkDir()cria. Se o diretório existir, ele retornará false; portanto, para verificar o diretório que você criou, chame apenasexists() se mkDir()retornar false.

assertThat()irá verificar o resultado e falhará se exists()retornar falso. ofc, você pode usar outras coisas para lidar com o diretório não criado.


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

    }
}

Como mencionado no comentário de @mwhs na resposta de Jigar Joshi, verificar a existência primeiro não é apenas não necessário, mas também uma péssima idéia.
Bdoserror

-7

Você também pode consultar a função makdir () para criar um novo diretório em uma pasta onde desejar.


9
Não há método nomeado makdir. Se você quis dizer mkdir, como isso adiciona algo às respostas existentes?
Ted Hopp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.