Bagaimana cara membuat direktori di Jawa?

387

Bagaimana cara membuat Direktori / folder?

Setelah saya uji System.getProperty("user.home");

Saya harus membuat direktori (nama direktori "folder baru") jika dan hanya jika folder baru tidak ada.

jimmy
sumber
24
silakan tinjau pilihan jawaban Anda yang benar. Solusi yang diusulkan oleh JigarJoshi menyesatkan. Itu tidak mengatasi masalah dengan benar (lihat komentar saya). Solusi (sederhana) yang diusulkan oleh Bozho jauh lebih baik.
mwhs
mkdiridempotent di java. Implementasi akan melakukan pemeriksaan jika direktori ada untuk Anda, dan hanya membuatnya jika tidak ada.
mwhs

Jawaban:

461

Setelah ~ 7 tahun, saya akan memperbaruinya ke pendekatan yang lebih baik yang disarankan oleh Bozho.

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

Usang:

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
sumber
241
-1: Itu sebenarnya teknik yang sangat buruk untuk membuat direktori. Akses ke FS tidak disediakan untuk sumber daya khusus. Antara if(!theDir.exists())dan theDir.mkdir()statusnya bisa berubah, juga bisa berubah di antara tidak membuat direktori (karena existskembali true) dan membutuhkannya. Hasil dari metode ini existstidak boleh digunakan untuk memutuskan apakah akan membuat direktori atau tidak. Panggil saja mkdir, tidak terkecuali akan terlempar jika sudah ada.
mwhs
4
@ mwhs saya mengerti bahwa lebih baik tidak memeriksa direktori tapi saya tidak mengerti pembenaran Anda (bagian kedua). Tidak bisakah status berubah antara memanggil mkdirdan membutuhkan direktori juga? Saya berasumsi Anda bermaksud bahwa beberapa proses lain menghapus direktori.
Episodex
2
@Episodex Directories adalah sumber daya bersama. Hanya saja, jangan gunakan solusi di atas, itu salah karena alasan yang berbeda. Tidak jelas bagaimana PO bisa berpikir ini adalah jawaban yang benar. Jika Anda ingin pernyataan tentang sumber daya IO, Anda perlu menggunakan kunci, bukan boolean.
mwhs
44
@ mhws Saya tahu posting ini berumur beberapa bulan tetapi jika Anda melihat mkdirsimplementasinya, dari kode sumber, hal pertama yang dipanggil adalah if (exists()) { return false; }. Implementasi itu sendiri memeriksa terlebih dahulu untuk melihat apakah direktori sudah ada sehingga satu-satunya jawaban yang salah untuk ini, mungkin, memeriksa kondisi itu 2x. Tidak sedekat yang Anda bayangkan.
Michael Hogenson
5
Pada Java 7, Anda mungkin harus menggunakan metode Filesseperti dalam jawaban yang lebih baru oleh Benoit Blanchon. (Jawaban ini tampaknya telah ditulis sebelum Jawa 7.)
Brick
504
new File("/path/directory").mkdirs();

Di sini "direktori" adalah nama direktori yang ingin Anda buat / ada.

Bozho
sumber
30
Jawaban yang jauh lebih baik daripada yang dipilih sebagai yang benar oleh OP. Memeriksa keberadaan direktori sebelum membuatnya harus menjadi anti-pola yang terkenal.
mwhs
7
bagaimana jika direktori tersebut sudah ada? Itu akan menimpa? atau lewati prosesnya.
Avinash Raj
3
@AvinashRaj silakan periksa docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs ()
Tascalator
1
@Tascalator tidak jelas dari dokumentasi dapatkah Anda menguraikan? Juga jawaban harus dilengkapi dengan jawaban atas what if the directory is already exists? It would do overwriting? or skip the process.pertanyaan.
mrgloom
3
sudah jelas:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus
147

Dengan Java 7, Anda dapat menggunakan Files.createDirectories().

Contohnya:

Files.createDirectories(Paths.get("/path/to/directory"));
Benoit Blanchon
sumber
12
Saya pikir opsi ini tidak ada pada saat T&J asli, tetapi ini harus menjadi jawaban ke depan, saya pikir.
Brick
6
Juga akan baik untuk dicatat bahwa:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS
Terima kasih telah menunjukkan perbedaannya dengan createDirectory dan createDirectories. Saya menemukan ini pilihan penamaan yang buruk.
seinecle
(2019) Saya menggunakan Files.createDirectory (Paths.get (directory.toString ())); di mana direktori adalah objek File. Jangan lupa untuk menangkap IOException Anda
chrips
@ chrips. Lebih baik melakukannya directory.toPath().
Ruslan Stelmachenko
37

Anda dapat mencoba FileUtils # forceMkdir

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

Perpustakaan ini memiliki banyak fungsi yang bermanfaat.

ahvargas
sumber
1
Jauh lebih baik daripada mkdir murni: menangani konkurensi, memeriksa apakah operasi berhasil, memeriksa apakah direktori (bukan file!) Ada.
Andrey
29

mkdir vs mkdirs


Jika Anda ingin membuat penggunaan direktori tunggal mkdir

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

Jika Anda ingin membuat hierarki penggunaan struktur folder mkdirs

 new File("/path/directory").mkdirs();
Buru
sumber
22
  1. Buat direktori tunggal.

    new File("C:\\Directory1").mkdir();
  2. Buat direktori bernama "Directory2 dan semua sub-direktori" Sub2 ″ dan "Sub-Sub2 ″ bersamaan.

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

Sumber: tutorial yang sempurna ini , Anda juga menemukan contoh penggunaan.

Mouna
sumber
15

Untuk java 7 dan lebih tinggi:

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

Tampaknya tidak perlu memeriksa keberadaan dir atau file sebelum membuat, dari createDirectories javadocs :

Buat direktori dengan membuat semua direktori induk yang tidak ada terlebih dahulu. Berbeda dengan metode createDirectory, pengecualian tidak dilemparkan jika direktori tidak dapat dibuat karena sudah ada. Parameter attrs adalah atribut file opsional untuk disetel secara atom ketika membuat direktori yang tidak ada. Setiap atribut file diidentifikasi berdasarkan namanya. Jika lebih dari satu atribut dengan nama yang sama dimasukkan dalam array maka semua kecuali kejadian terakhir diabaikan.

Jika metode ini gagal, maka ia mungkin melakukannya setelah membuat beberapa, tetapi tidak semua, direktori induk.

groo
sumber
7

Metode berikut harus melakukan apa yang Anda inginkan, pastikan Anda memeriksa nilai pengembalian 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
sumber
2
Seperti disebutkan dalam komentar oleh @mwhs pada jawaban Jigar Joshi, memeriksa keberadaan pertama tidak hanya tidak perlu tetapi sebenarnya ide yang buruk.
Bdoserror
4

Padahal pertanyaan ini sudah terjawab. Saya ingin meletakkan sesuatu yang ekstra, yaitu jika ada file dengan nama direktori yang Anda coba buat daripada yang seharusnya menyebabkan kesalahan. Untuk pengunjung masa depan.

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");
        }
    }
}
skor
sumber
3
Seperti disebutkan dalam komentar oleh @mwhs pada jawaban Jigar Joshi, memeriksa keberadaan pertama tidak hanya tidak perlu tetapi sebenarnya ide yang buruk.
Bdoserror
4

Rapi dan bersih:

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

Nah untuk membuat Direktori / folder di java kita punya dua metode

Di sini, metode direktori membuat direktori tunggal jika tidak ada.

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

Dan

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

Di sini metode direktori maked akan membuat semua direktori yang hilang di jalur yang diwakili objek file.

Misalnya merujuk tautan di bawah ini (dijelaskan dengan sangat baik). Semoga ini bisa membantu !! https://www.flowerbrackets.com/create-directory-java-program/

Siwa
sumber
3

Hanya ingin menunjukkan kepada semua orang yang menelepon File.mkdir()atau File.mkdirs()untuk berhati-hati Fileobjeknya adalah direktori dan bukan file. Misalnya jika Anda memanggil mkdirs()path /dir1/dir2/file.txt, itu akan membuat folder dengan nama file.txtyang mungkin bukan yang Anda inginkan. Jika Anda membuat file baru dan juga ingin secara otomatis membuat folder induk, Anda dapat melakukan sesuatu seperti ini:

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

Ini cara kerjanya bagi saya melakukan satu direktori tunggal atau lebih atau mereka: perlu mengimpor java.io.File;
/ * masukkan kode di bawah ini untuk menambahkan dir1 diectory atau periksa apakah ada dir1, jika tidak, maka buatlah dan sama dengan dir2 dan 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
sumber
0

Fungsi ini memungkinkan Anda untuk membuat direktori di direktori home user.

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
sumber
Seperti disebutkan dalam komentar oleh @mwhs pada jawaban Jigar Joshi, memeriksa keberadaan pertama tidak hanya tidak perlu tetapi sebenarnya ide yang buruk.
Bdoserror
0

jika Anda ingin memastikan itu dibuat maka ini:

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

karena mkDir() mengembalikan boolean, dan findbugs akan menangis jika Anda tidak menggunakan variabel. Juga tidak bagus ...

mkDir()mengembalikan hanya benar jika mkDir()membuatnya. Jika dir ada, ia mengembalikan false, jadi untuk memverifikasi dir yang Anda buat, hanya panggil exists()jikamkDir() return salah.

assertThat()akan memeriksa hasilnya dan gagal jika exists()mengembalikan false. ofc Anda dapat menggunakan hal-hal lain untuk menangani direktori yang tidak dibuat.

l0wacska
sumber
-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
sumber
Seperti disebutkan dalam komentar oleh @mwhs pada jawaban Jigar Joshi, memeriksa keberadaan pertama tidak hanya tidak perlu tetapi sebenarnya ide yang buruk.
Bdoserror
-7

Anda juga dapat merujuk fungsi makdir () untuk membuat direktori baru di folder yang Anda inginkan.

arun
sumber
9
Tidak ada metode yang dinamai makdir. Jika Anda maksudkan mkdir, bagaimana ini menambahkan sesuatu ke jawaban yang ada?
Ted Hopp