Java'da dizin nasıl oluşturulur?


386

Dizin / klasör nasıl oluştururum?

Test ettikten sonra System.getProperty("user.home");

Yalnızca yeni klasör yoksa bir dizin (dizin adı "yeni klasör") oluşturmak zorundayım.


24
lütfen doğru cevap seçiminizi inceleyin. JigarJoshi tarafından önerilen çözüm yanıltıcıdır. Sorunu doğru bir şekilde ele almıyor (yorumuma bakın). Bozho tarafından önerilen (basit) çözüm çok daha iyi.
mwhs

mkdirJava'da idempotent. Uygulama, dizinin sizin için var olup olmadığını kontrol eder ve yalnızca yoksa oluşturur.
mwhs

Yanıtlar:


460

~ 7 yıl sonra, Bozho tarafından önerilen daha iyi bir yaklaşıma güncelleyeceğim.

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

Kullanımdan kaldırılan:

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: Bu aslında bir dizin oluşturmak için gerçekten kötü bir teknik. FS'ye erişim özel bir kaynağa ayrılmamıştır. Arasında if(!theDir.exists())ve theDir.mkdir()statü değişmiş olabilir, hem de o arada değişebilir olarak değil (çünkü dizin oluşturma existsdönen true) ve ona ihtiyaç duyan. Yöntemin sonucu existsasla bir dizin oluşturulup oluşturulmayacağına karar vermek için kullanılmamalıdır. Sadece arayın mkdir, zaten varsa istisna atılmayacaktır.
mwhs

4
@mwhs Dizini kontrol etmemenin daha iyi olduğunu anlıyorum, ancak gerekçenizi anlamıyorum (ikinci bölüm). Durum arama mkdirve dizine ihtiyaç duyma arasında da değişemez mi? Başka bir işlemin dizini sildiğini kastettiğinizi varsayıyorum.
Episodex

2
@Episodex Dizinler paylaşılan kaynaklardır. Yukarıdaki çözümü kullanmayın, farklı nedenlerle yanlış. PO'nun bunun doğru cevap olduğunu nasıl düşündüğü belirsiz. ES kaynakları ile ilgili iddialarda boolean değil kilit kullanmanız gerekir.
mwhs

44
@mhws Bu yazının birkaç aylık olduğunu biliyorum, ancak mkdirsuygulamaya bakarsanız , kaynak koddan, ilk gelen şey if (exists()) { return false; }. Uygulamanın kendisi önce dizinin zaten var olup olmadığını kontrol eder, bu nedenle bu cevabın hatalı olduğu tek şey, belki de bu durumu 2x kontrol etmektir. Olduğu kadar kötü değil.
Michael Hogenson

5
Java 7'den itibaren, muhtemelen FilesBenoit Blanchon'ın daha yeni cevabında olduğu gibi yöntemleri kullanmalısınız . (Bu cevap Java 7'den önce yazılmış gibi görünüyor.)
Brick

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

Burada "dizin" oluşturmak / var olmak istediğiniz dizinin adıdır.


30
OP tarafından doğru olandan çok daha iyi cevap. Dizini oluşturmadan önce varlığını kontrol etmek iyi bilinen bir anti-desen haline gelmelidir.
mwhs

7
dizin zaten varsa? Üzerine yazma yapar mı? veya işlemi atlayın.
Avinash Raj


1
@Tascalator belgelerin net olmadığı açıklanabilir mi? Ayrıca cevap, soruya verilen cevap ile tamamlanmalıdır what if the directory is already exists? It would do overwriting? or skip the process..
mrgloom

3
açık:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

146

Java 7 ile kullanabilirsiniz Files.createDirectories().

Örneğin:

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

12
Bence bu seçenek orijinal Soru-Cevap zamanında mevcut değildi, ancak ileride cevap bu olmalı diye düşünüyorum.
Tuğla

6
Ayrıca şunu da belirtmek gerekir:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS

CreateDirectory ve createDirectories arasındaki farkı işaret ettiğiniz için teşekkür ederiz. Kötü bir adlandırma seçeneği buluyorum.
seinecle

(2019) Files.createDirectory (Paths.get (directory.toString ())) kullandım; burada dizin bir File nesnesidir. IOException'ınızı yakalamayı unutmayın
chrips

@chrips O directory.toPath()zaman yapmak daha iyidir .
Ruslan Stelmachenko

37

FileUtils # forceMkdir'i deneyebilirsiniz

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

Bu kütüphane çok faydalı fonksiyonlara sahiptir.


1
Saf mkdir'lerden çok daha iyi: eşzamanlılığı işler, işlemin başarılı olup olmadığını kontrol eder, dizinin (bir dosya değil!) Var olup olmadığını kontrol eder.
Andrey

28

mkdir vs mkdirs


Tek bir dizin oluşturmak istiyorsanız mkdir

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

Klasör yapısı hiyerarşisi oluşturmak istiyorsanız şunu kullanın: mkdirs

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

21
  1. Tek bir dizin oluşturun.

    new File("C:\\Directory1").mkdir();
  2. “Dizin2 ve tüm alt dizinleri“ Sub2 ″ ve “Sub-Sub2 ″ adlı bir dizin oluşturun.

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

Kaynak: Bu mükemmel öğretici , bir kullanım örneği de bulabilirsiniz.


14

Java 7 ve üstü için:

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

CreateDirectories javadocs'dan oluşturmadan önce dir veya dosyanın varlığını kontrol etmek gereksiz görünüyor :

Önce varolmayan tüm üst dizinleri oluşturarak bir dizin oluşturur. CreateDirectory yönteminin aksine, dizin zaten var olduğu için oluşturulamadıysa bir istisna atılmaz. Attrs parametresi, varolmayan dizinleri oluştururken atomik olarak ayarlanacak isteğe bağlı dosya öznitelikleridir. Her dosya özniteliği adıyla tanımlanır. Diziye aynı adda birden fazla öznitelik dahil edilirse, son olay dışındaki tüm öznitelikler yoksayılır.

Bu yöntem başarısız olursa, üst dizinlerin tümünü olmasa da bir kısmını oluşturduktan sonra bunu yapabilir.


7

Aşağıdaki yöntem istediğinizi yapmalıdır, mkdir () / mkdirs () dönüş değerini kontrol ettiğinizden emin olun.

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
Mwhs'ın Jigar Joshi'nin cevabı hakkındaki yorumunda belirtildiği gibi, önce varlığını kontrol etmek sadece gerekli değil, aslında kötü bir fikirdir.
Bdoserror

4

Bu soru cevaplanmış olmasına rağmen. Ekstra bir şey koymak istiyorum, yani oluşturmaya çalıştığınız dizin adıyla bir dosya varsa bir hata istemek daha var. Gelecek ziyaretçiler için.

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
Mwhs'ın Jigar Joshi'nin cevabı hakkındaki yorumunda belirtildiği gibi, önce varlığını kontrol etmek sadece gerekli değil, aslında kötü bir fikirdir.
Bdoserror

4

Düzgün ve temiz:

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 dizin / klasör oluşturmak için iki yöntem var

Burada makedirectory yöntemi yoksa tek bir dizin oluşturur.

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

Ve

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

Burada makedirectories yöntemi, dosya nesnesinin temsil ettiği yolda eksik olan tüm dizinleri oluşturur.

Örneğin, aşağıdaki bağlantıya bakın (çok iyi açıklanmıştır). Umarım yardımcı olur!! https://www.flowerbrackets.com/create-directory-java-program/


3

Sadece çağıran herkese işaret etmek File.mkdir()ya File.mkdirs()da Filenesnenin bir dosya değil, bir dizin olduğunu belirtmek istedim . Aradığınızda Örneğin mkdirs()yolu için /dir1/dir2/file.txt, bir yaratacak klasörü adıyla file.txtİstediğin muhtemelen değil. Yeni bir dosya oluşturuyorsanız ve otomatik olarak üst klasörler oluşturmak istiyorsanız, aşağıdakine benzer bir şey yapabilirsiniz:

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

2

Benim için bu şekilde çalışır tek bir dizin veya daha fazla veya onları yapmak: java.io.File almak gerekir;
/ * bir dizin dir1 eklemek için aşağıdaki kodu girin veya dir1'in var olup olmadığını kontrol edin, eğer yoksa, dir2 ve dir3 ile aynı şekilde oluşturun * /

    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

Bu işlev, kullanıcı giriş dizininde bir dizin oluşturmanıza olanak tanır.

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

Mwhs'ın Jigar Joshi'nin cevabı hakkındaki yorumunda belirtildiği gibi, önce varlığını kontrol etmek sadece gerekli değil, aslında kötü bir fikirdir.
Bdoserror

0

yaratıldığından emin olmak istiyorsanız şu:

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()bir boole döndürür ve değişkeni kullanmazsanız findbugs bunun için ağlar. Ayrıca hoş değil ...

mkDir()yalnızca mkDir()oluşturursa true değerini döndürür . Dir varsa, o kadar oluşturduğunuz dir, sadece çağrı doğrulamak için, yanlış döndürür exists()eğer mkDir()dönüş yanlış.

assertThat()sonucu kontrol eder ve exists()false değerini döndürürse başarısız olur . işlenmemiş dizini işlemek için başka şeyler kullanabilirsiniz.


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

    }
}

Mwhs'ın Jigar Joshi'nin cevabı hakkındaki yorumunda belirtildiği gibi, önce varlığını kontrol etmek sadece gerekli değil, aslında kötü bir fikirdir.
Bdoserror

-7

İstediğiniz klasörde yeni bir dizin oluşturmak için makdir () işlevine de başvurabilirsiniz .


9
Adında bir yöntem yok makdir. Eğer demek istediyseniz mkdir, bu mevcut cevaplara nasıl bir şey ekler?
Ted Hopp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.