Javaでディレクトリを作成する方法は?


387

ディレクトリ/フォルダを作成するにはどうすればよいですか?

テストしたら System.getProperty("user.home");

新しいフォルダが存在しない場合にのみ、ディレクトリ(ディレクトリ名「新しいフォルダ」)を作成する必要があります。


24
正しい答えの選択を確認してください。JigarJoshiによって提案されたソリューションは誤解を招くものです。問題に正しく対処していません(私のコメントを参照)。Bozhoによって提案された(シンプルな)ソリューションははるかに優れています。
mwhs 2013年

mkdirJavaではべき等です。実装は、ディレクトリが存在するかどうかをチェックし、存在しない場合にのみ作成します。
mwhs 2015

回答:


461

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

241
-1:これは実際には、ディレクトリを作成するための本当に悪いテクニックです。FSへのアクセスは専用リソースに予約されていません。との間if(!theDir.exists())theDir.mkdir()ステータスが変更された可能性があります。また、ディレクトリを作成しない(にexists戻るためtrue)と必要になるまでの間に変更される可能性があります。メソッドの結果は、existsディレクトリを作成するかどうかを決定するために決して使用されるべきではありません。を呼び出すだけでmkdir、すでに存在する場合は例外はスローされません。
mwhs 2013年

4
@mwhs私はディレクトリをチェックしない方が良いことを理解していますが、あなたの正当性を理解していません(後編)。mkdirディレクトリの呼び出しと必要性の間でステータスを変更することもできませんか?他のプロセスがディレクトリを削除することを意味していたと思います。
Episodex

2
@Episodexディレクトリは共有リソースです。上記のソリューションを使用しないでください。さまざまな理由で間違っています。これが正解であるとPOがどのように考えていたのかは不明です。IOリソースに関するアサーションが必要な場合は、ブール値ではなくロックを使用する必要があります。
mwhs '20 / 07/20

44
@mhwsこの投稿は2か月前のものであることはわかっていますがmkdirs、ソースコードから実装を見ると、最初に呼び出されるのはif (exists()) { return false; }です。実装自体は最初にディレクトリがすでに存在するかどうかを確認するため、この回答の誤りは、おそらく2xの条件を確認することだけです。あなたがそうであると思っているほど悪くはありません。
Michael Hogenson 2015年

5
Java 7以降Filesでは、Benoit Blanchonによる最新の回答のように、おそらくメソッドを使用する必要があります。(この回答はJava 7より前に書かれたようです。)
Brick

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

ここで「ディレクトリ」は、作成または存在させたいディレクトリの名前です。


30
OPによって正しいものとして選択されたものよりもはるかに良い答え。作成する前にディレクトリの存在を確認することは、よく知られたアンチパターンになるはずです。
mwhs 2013年

7
ディレクトリがすでに存在する場合はどうなりますか?上書きしますか?またはプロセスをスキップします。
Avinash Raj


1
@Tascalatorはドキュメントから明確ではありませんが、詳しく説明できますか?また、回答はwhat if the directory is already exists? It would do overwriting? or skip the process.質問に対する回答で補完する必要があります。
mrgloom 2017年

3
それは明らかです:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

147

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

createDirectoryとcreateDirectoriesの違いを指摘していただきありがとうございます。ネーミングの選択としては不適切だと思います。
セーヌクル

(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

29

mkdir vs mkdirs


単一のディレクトリを作成する場合は、 mkdir

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

フォルダ構造の階層を作成したい場合は、 mkdirs

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

22
  1. 単一のディレクトリを作成します。

    new File("C:\\Directory1").mkdir();
  2. 「Directory2」という名前のディレクトリとそのすべてのサブディレクトリ「Sub2」および「Sub-Sub2」を一緒に作成します。

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

出典:この完全なチュートリアル、使用例もご覧いただけます。


15

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 2014年

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 2014年

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

Javaでディレクトリ/フォルダを作成するには、2つの方法があります

ここで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()、path を呼び出すと、必要な名前とは異なる名前のフォルダー/dir1/dir2/file.txtが作成されますfile.txt。新しいファイルを作成していて、親フォルダーも自動的に作成したい場合は、次のようにします。

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

2

これは、私が1つまたは複数のディレクトリを実行する方法です。java.io.Fileをインポートする必要があります。
/ * 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 2014年

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 2014年

-7

また、makdir()関数を参照して、目的のフォルダに新しいディレクトリを作成することもできます。


9
というメソッドはありませんmakdir。もしあなたが意味したならmkdir、これはどのように既存の答えに何かを追加しますか?
Ted Hopp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.