Java로 디렉토리를 작성하는 방법은 무엇입니까?


386

디렉토리 / 폴더를 작성하는 방법

테스트를 마치면 System.getProperty("user.home");

새 폴더가없는 경우에만 디렉토리 (디렉토리 이름 "new folder")를 작성해야합니다.


24
정답 선택을 검토하십시오. JigarJoshi가 제안한 솔루션이 잘못되었습니다. 문제를 올바르게 해결하지 못합니다 (내 의견 참조). Bozho가 제안한 (간단한) 솔루션이 훨씬 좋습니다.
mwhs

mkdirJava에서 dem 등원입니다. 구현시 디렉토리가 존재하는지 확인하고 존재하지 않는 경우에만 작성합니다.
mwhs

답변:


460

~ 7 년 후, Bozho가 제안한 더 나은 접근 방식으로 업데이트하겠습니다.

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

더 이상 사용되지 않음 :

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

240
-1 : 실제로 디렉토리를 만드는 것은 매우 나쁜 기술입니다. FS에 대한 액세스는 전용 리소스에 예약되어 있지 않습니다. 사이 if(!theDir.exists())theDir.mkdir()상태가 변경되었을 수 있습니다뿐만 아니라, 그 사이에서 변경 될 수 있습니다으로 하지 (때문에의 디렉토리를 생성 exists반환 true)하고 필요. 메소드의 결과 exists는 디렉토리 작성 여부를 결정하는 데 사용되어서는 안됩니다. 그냥 호출 mkdir하면 이미 존재하는 경우 예외가 발생하지 않습니다.
mwhs

4
@ mwhs 나는 디렉토리를 확인하지 않는 것이 낫다는 것을 이해하지만 당신의 정당성을 이해하지 못한다 (두 번째 부분). mkdir디렉토리 호출 과 필요 사이의 상태를 변경할 수 없습니까 ? 다른 프로세스가 디렉토리를 삭제한다는 것을 의미한다고 가정합니다.
Episodex

2
@Episodex 디렉토리는 공유 리소스입니다. 위의 솔루션을 사용하지 마십시오. 다른 이유로 잘못되었습니다. PO가 어떻게 이것이 정답이라고 생각할 수 있었는지 불분명합니다. IO 리소스에 대한 어설 션을 원하면 부울이 아닌 잠금을 사용해야합니다.
mwhs

44
@mhws 나는이 게시물이 몇 달 전이라는 것을 알고 있지만 mkdirs소스 코드에서 구현 을 보면 가장 먼저 호출되는 것은 if (exists()) { return false; }입니다. 구현 자체는 디렉토리가 이미 존재하는지 먼저 확인 하므로이 답변이 잘못 된 것은 아마도 2x 조건을 확인하는 것입니다. 당신이 그것을 만드는 것만 큼 나쁘지 않습니다.
마이클 호 겐슨

5
Java 7 Files부터는 Benoit Blanchon의 최신 답변과 마찬가지로 메소드를 사용해야합니다 . (이 답변은 Java 7 이전에 작성된 것으로 보입니다.)
Brick

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

여기에서 "디렉토리"는 만들거나 존재하려는 디렉토리의 이름입니다.


30
OP가 올바른 것으로 선택한 것보다 훨씬 나은 답변입니다. 디렉토리를 작성하기 전에 디렉토리의 존재를 점검하면 잘 알려진 안티 패턴이되어야합니다.
mwhs

7
디렉토리가 이미 존재하면 어떻게합니까? 덮어 쓰겠습니까? 또는 프로세스를 건너 뜁니다.
Avinash Raj


1
@Tascalator 문서에서 명확하지 않습니까? 또한 답변은 what if the directory is already exists? It would do overwriting? or skip the process.질문에 대한 답변으로 보완되어야합니다 .
mrgloom

3
그것은 분명하다 :Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

146

Java 7을 사용하면 Files.createDirectories() .

예를 들어 :

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

12
원래의 Q & A 당시에는이 옵션이 존재하지 않았다고 생각하지만, 이것이 앞으로 답이되어야한다고 생각합니다.
벽돌

6
또한 노트에 좋은 것이라고 :Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
키스 OYS

btw createDirectory와 createDirectories의 차이점을 지적 해 주셔서 감사합니다. 나는 그것이 나쁜 명명 선택을 발견합니다.
seinecle

(2019) 나는 Files.createDirectory (Paths.get (directory.toString ())); 여기서 directory는 File 객체입니다. IOException을 놓치지 마십시오.
chrips

@chrips 그때하는 것이 좋습니다 directory.toPath().
Ruslan Stelmachenko

37

FileUtils # forceMkdir을 사용해 볼 수 있습니다

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

라이브러리 에는 유용한 기능이 많이 있습니다.


1
순수 mkdirs보다 훨씬 낫습니다. 동시성을 처리하고, 작업이 성공했는지 확인하고, 파일이 아닌 디렉토리가 있는지 확인합니다.
Andrey

28

mkdir vs mkdirs


단일 디렉토리를 사용하려면 mkdir

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

폴더 구조의 계층 구조를 작성하려면 mkdirs

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

21
  1. 단일 디렉토리를 작성하십시오.

    new File("C:\\Directory1").mkdir();
  2. "Directory2"및 모든 서브 디렉토리 "Sub2"및 "Sub-Sub2"로 이름 지정된 디렉토리를 작성하십시오.

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

출처 :이 완벽한 자습서 , 사용 예도 있습니다.


14

Java 7 이상 :

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

createDirectories javadocs에서 작성하기 전에 디렉토리 또는 파일의 존재를 점검 할 필요가없는 것 같습니다 .

존재하지 않는 모든 상위 디렉토리를 먼저 작성하여 디렉토리를 작성합니다. createDirectory 메소드와 달리 디렉토리가 이미 존재하여 디렉토리를 작성할 수없는 경우 예외가 발생하지 않습니다. attrs 매개 변수는 존재하지 않는 디렉토리를 작성할 때 원자 적으로 설정하기위한 선택적 파일 속성입니다. 각 파일 속성은 이름으로 식별됩니다. 동일한 이름의 속성이 둘 이상 배열에 포함 된 경우 마지막 항목을 제외한 모든 속성이 무시됩니다.

이 방법이 실패하면 부모 디렉토리의 전부는 아니지만 일부를 만든 후에 그렇게 할 수 있습니다.


7

다음 메소드는 원하는 것을 수행해야합니다. 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
Jigar Joshi의 답변에 대한 @mwhs의 의견에서 언급했듯이, 존재를 먼저 확인하는 것이 필요 할뿐만 아니라 실제로 나쁜 생각입니다.
Bdoserror

4

이 질문에 대한 답변이 있지만. 여분의 것을 넣고 싶습니다. 즉, 만들려는 디렉토리 이름을 가진 파일이 있으면 오류를 표시하는 것보다 더 있습니다. 미래 방문자를 위해.

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
Jigar Joshi의 답변에 대한 @mwhs의 의견에서 언급했듯이, 존재를 먼저 확인하는 것이 필요 할뿐만 아니라 실제로 나쁜 생각입니다.
Bdoserror

4

청초한:

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

자바에서 디렉토리 / 폴더를 만들려면 두 가지 방법이 있습니다.

여기서 makedirectory 메소드는 존재하지 않는 경우 단일 디렉토리를 작성합니다.

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

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

여기서 makedirectories 메소드는 파일 객체가 나타내는 경로에없는 모든 디렉토리를 만듭니다.

예를 들어 아래 링크를 참조하십시오 (매우 잘 설명되어 있음). 그것이 도움이되기를 바랍니다! https://www.flowerbrackets.com/create-directory-java-program/


3

호출하는 모든 사람을 지적 File.mkdir()하거나 객체가 파일이 아닌 디렉토리 File.mkdirs()라는 것을주의하고 싶었습니다 File. 예를 들어 mkdirs()경로 를 호출 하면 원하는 이름 이 아닌 이름 /dir1/dir2/file.txt폴더 가 만들어 file.txt집니다. 새 파일을 만들고 부모 폴더를 자동으로 만들려면 다음과 같이 할 수 있습니다.

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

2

이것은 하나의 단일 디렉토리 이상을 수행하는 방법입니다. java.io.File을 가져와야합니다.
/ * 아래 코드를 입력하여 didiry dir1을 추가하거나 dir1이 존재하는지 확인하십시오. 존재하지 않는 경우 dir2 및 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

이 기능을 사용하면 사용자 홈 디렉토리에 디렉토리를 작성할 수 있습니다.

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

Jigar Joshi의 답변에 대한 @mwhs의 의견에서 언급했듯이, 존재를 먼저 확인하는 것이 필요 할뿐만 아니라 실제로 나쁜 생각입니다.
Bdoserror

0

생성되었는지 확인하려면 다음을 수행하십시오.

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()는 부울을 반환하며 변수를 사용하지 않으면 findbugs가이를 부릅니다. 또한 좋지 않습니다 ...

mkDir()mkDir()작성하는 경우에만 true를 리턴 합니다. dir이 존재하면 false를 리턴하므로 작성한 dir을 검증하려면 false를 리턴하는 exists()경우 에만 호출 하십시오 mkDir().

assertThat()결과를 확인하고 exists()false를 반환 하면 실패합니다 . 다른 것들을 사용하여 생성되지 않은 디렉토리를 처리 할 수 ​​있습니다.


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

    }
}

Jigar Joshi의 답변에 대한 @mwhs의 의견에서 언급했듯이, 존재를 먼저 확인하는 것이 필요 할뿐만 아니라 실제로 나쁜 생각입니다.
Bdoserror

-7

원하는 폴더에 새 디렉토리를 작성하기 위해 makdir () 함수를 참조 할 수도 있습니다 .


9
라는 이름의 메소드가 없습니다 makdir. 당신이 의미한다면 mkdir, 이것은 어떻게 기존 답변에 어떤 것을 추가합니까?
Ted Hopp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.