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.
newFile("/path/directory").mkdirs();
Usang:
File theDir =newFile("new folder");// if the directory does not exist, create itif(!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");}}
-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
newFile("/path/directory").mkdirs();
Di sini "direktori" adalah nama direktori yang ingin Anda buat / ada.
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.
@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
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().
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.
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.
publicstaticvoid makeDir(){File directory =newFile(" 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");}}}
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;publicclassRevCreateDirectory{publicvoid revCreateDirectory(){//To create single directory/folderFile file =newFile("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/foldersFile files =newFile("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!");}}}}
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:
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 =newFile("C:\\dir1");if(!filed.exists()){if(filed.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}File filel =newFile("C:\\dir1\\dir2");if(!filel.exists()){if(filel.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}File filet =newFile("C:\\dir1\\dir2\\dir3");if(!filet.exists()){if(filet.mkdir()){System.out.println("directory is created");}}else{System.out.println("directory exist");}
Seperti disebutkan dalam komentar oleh @mwhs pada jawaban Jigar Joshi, memeriksa keberadaan pertama tidak hanya tidak perlu tetapi sebenarnya ide yang buruk.
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.
publicclassTest1{publicstaticvoid main(String[] args){String path =System.getProperty("user.home");File dir=newFile(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();}}}
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.
mkdir
idempotent di java. Implementasi akan melakukan pemeriksaan jika direktori ada untuk Anda, dan hanya membuatnya jika tidak ada.Jawaban:
Setelah ~ 7 tahun, saya akan memperbaruinya ke pendekatan yang lebih baik yang disarankan oleh Bozho.
Usang:
sumber
if(!theDir.exists())
dantheDir.mkdir()
statusnya bisa berubah, juga bisa berubah di antara tidak membuat direktori (karenaexists
kembalitrue
) dan membutuhkannya. Hasil dari metode iniexists
tidak boleh digunakan untuk memutuskan apakah akan membuat direktori atau tidak. Panggil sajamkdir
, tidak terkecuali akan terlempar jika sudah ada.mkdir
dan membutuhkan direktori juga? Saya berasumsi Anda bermaksud bahwa beberapa proses lain menghapus direktori.mkdirs
implementasinya, dari kode sumber, hal pertama yang dipanggil adalahif (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.Files
seperti dalam jawaban yang lebih baru oleh Benoit Blanchon. (Jawaban ini tampaknya telah ditulis sebelum Jawa 7.)Di sini "direktori" adalah nama direktori yang ingin Anda buat / ada.
sumber
what if the directory is already exists? It would do overwriting? or skip the process.
pertanyaan.Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Dengan Java 7, Anda dapat menggunakan
Files.createDirectories()
.Contohnya:
sumber
Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
directory.toPath()
.Anda dapat mencoba FileUtils # forceMkdir
Perpustakaan ini memiliki banyak fungsi yang bermanfaat.
sumber
mkdir vs mkdirs
Jika Anda ingin membuat penggunaan direktori tunggal
mkdir
Jika Anda ingin membuat hierarki penggunaan struktur folder
mkdirs
sumber
Buat direktori tunggal.
Buat direktori bernama "Directory2 dan semua sub-direktori" Sub2 ″ dan "Sub-Sub2 ″ bersamaan.
Sumber: tutorial yang sempurna ini , Anda juga menemukan contoh penggunaan.
sumber
Untuk java 7 dan lebih tinggi:
Tampaknya tidak perlu memeriksa keberadaan dir atau file sebelum membuat, dari createDirectories javadocs :
sumber
Metode berikut harus melakukan apa yang Anda inginkan, pastikan Anda memeriksa nilai pengembalian mkdir () / mkdirs ()
sumber
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.
sumber
Rapi dan bersih:
sumber
Nah untuk membuat Direktori / folder di java kita punya dua metode
Di sini, metode direktori membuat direktori tunggal jika tidak ada.
Dan
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/
sumber
Hanya ingin menunjukkan kepada semua orang yang menelepon
File.mkdir()
atauFile.mkdirs()
untuk berhati-hatiFile
objeknya adalah direktori dan bukan file. Misalnya jika Anda memanggilmkdirs()
path/dir1/dir2/file.txt
, itu akan membuat folder dengan namafile.txt
yang mungkin bukan yang Anda inginkan. Jika Anda membuat file baru dan juga ingin secara otomatis membuat folder induk, Anda dapat melakukan sesuatu seperti ini:sumber
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 * /
sumber
Fungsi ini memungkinkan Anda untuk membuat direktori di direktori home user.
sumber
jika Anda ingin memastikan itu dibuat maka ini:
karena
mkDir()
mengembalikan boolean, dan findbugs akan menangis jika Anda tidak menggunakan variabel. Juga tidak bagus ...mkDir()
mengembalikan hanya benar jikamkDir()
membuatnya. Jika dir ada, ia mengembalikan false, jadi untuk memverifikasi dir yang Anda buat, hanya panggilexists()
jikamkDir()
return salah.assertThat()
akan memeriksa hasilnya dan gagal jikaexists()
mengembalikan false. ofc Anda dapat menggunakan hal-hal lain untuk menangani direktori yang tidak dibuat.sumber
sumber
Anda juga dapat merujuk fungsi makdir () untuk membuat direktori baru di folder yang Anda inginkan.
sumber
makdir
. Jika Anda maksudkanmkdir
, bagaimana ini menambahkan sesuatu ke jawaban yang ada?