Saya sudah membaca dokumentasi Node.js dan, kecuali jika saya melewatkan sesuatu, ia tidak memberi tahu parameter apa yang terkandung dalam operasi tertentu, khususnya fs.mkdir()
. Seperti yang Anda lihat di dokumentasi, itu tidak terlalu banyak.
Saat ini, saya memiliki kode ini, yang mencoba membuat folder atau menggunakan yang sudah ada sebagai gantinya:
fs.mkdir(path,function(e){
if(!e || (e && e.code === 'EEXIST')){
//do something with contents
} else {
//debug
console.log(e);
}
});
Tetapi saya bertanya-tanya apakah ini cara yang tepat untuk melakukannya? Apakah memeriksa kode EEXIST
merupakan cara yang benar untuk mengetahui bahwa folder tersebut sudah ada? Saya tahu saya bisa melakukannya fs.stat()
sebelum membuat direktori, tetapi itu sudah menjadi dua hit ke sistem file.
Kedua, apakah ada dokumentasi lengkap atau setidaknya dokumentasi Node.js yang lebih terperinci yang memuat perincian tentang objek kesalahan apa, parameter apa yang menandakan, dll.
sumber
e &&
. Jika!e
gagal, maka Anda tahue
itu benar.Jawaban:
Cara yang baik untuk melakukannya adalah dengan menggunakan modul mkdirp .
Gunakan untuk menjalankan fungsi yang memerlukan direktori. Callback dipanggil setelah jalur dibuat atau jika jalur memang sudah ada. Kesalahan
err
diatur jika mkdirp gagal membuat jalur direktori.sumber
fs.exists(Sync)
.Sunting: Karena jawaban ini sangat populer, saya telah memperbaruinya untuk mencerminkan praktik terkini.
Node> = 10
{ recursive: true }
Opsi baru Nodefs
sekarang memungkinkan ini secara asli. Opsi ini meniru perilaku UNIXmkdir -p
. Itu akan secara rekursif memastikan setiap bagian dari jalan ada, dan tidak akan membuat kesalahan jika ada yang melakukannya.(Catatan: mungkin masih ada kesalahan seperti
EPERM
atauEACCESS
, jadi lebih baik jika masih membungkusnyatry {} catch (e) {}
jika implementasi Anda rentan terhadapnya.)Versi sinkron.
Versi async
Versi Node yang lebih lama
Dengan menggunakan
try {} catch (err) {}
, Anda dapat mencapai ini dengan sangat anggun tanpa menemui kondisi balapan.Untuk mencegah waktu mati antara memeriksa keberadaan dan membuat direktori, kami hanya mencoba membuatnya lurus ke atas, dan mengabaikan kesalahan jika itu
EEXIST
(direktori sudah ada).Namun, jika kesalahannya tidak
EEXIST
, kita harus melempar kesalahan, karena kita bisa berurusan dengan sesuatu sepertiEPERM
atauEACCES
Untuk
mkdir -p
-seperti perilaku rekursif, misalnya./a/b/c
, Anda harus menyebutnya pada setiap bagian dari dirpath itu, misalnya./a
,./a/b
,.a/b/c
sumber
Jika Anda ingin liner cepat dan kotor, gunakan ini:
sumber
fs.exists
sudah ditinggalkan: nodejs.org/api/fs.html#fs_fs_exists_path_callbackNode docs untuk
fs.mkdir
dasarnya tunduk pada halaman manual Linux untukmkdir(2)
. Itu menunjukkan bahwaEEXIST
juga akan ditunjukkan jika jalur ada tetapi bukan direktori yang membuat kasus sudut canggung jika Anda pergi rute ini.Anda mungkin lebih baik memanggil
fs.stat
yang akan memberi tahu Anda apakah jalur itu ada dan apakah itu direktori dalam satu panggilan. Untuk (apa yang saya asumsikan) kasus normal di mana direktori sudah ada, itu hanya satu sistem file hit.fs
Metode modul ini adalah pembungkus tipis di sekitar API C asli sehingga Anda harus memeriksa halaman manual yang dirujuk dalam dokumen node.js untuk detailnya.sumber
stat
sebelumnyamkdir
berpotensi untuk kondisi balapan - ingatlah ini.Anda bisa menggunakan ini:
sumber
statSync
akan melempar kesalahan jika entitas tidak ada sama sekali, menabrak kode. Anda harus membungkus ini dalam satutry/catch
blok.fs.existsSync()
danfs.exists()
akan dihentikan.Saya mengusulkan solusi tanpa modul (modul akumulasi tidak pernah direkomendasikan untuk pemeliharaan terutama untuk fungsi kecil yang dapat ditulis dalam beberapa baris ...):
PEMBAHARUAN TERAKHIR :
Di v10.12.0, opsi rekursif NodeJS impletement:
PEMBARUAN:
sumber
fs.exists()
ditinggalkan dalam simpul v9. gunakanfs.access()
saja. (kembaliundefined
jika file ada; jika tidak ada kesalahanENOENT
)fs.mkdirSync('my/new/folder/create', {recursive: true})
?Anda juga dapat menggunakan fs-extra , yang menyediakan banyak operasi file yang sering digunakan.
Kode sampel:
dokumen di sini: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback
sumber
Berikut adalah kode ES6 yang saya gunakan untuk membuat direktori (ketika tidak ada):
catatan:
createDirectory
fungsi, saya menormalkan jalur untuk menjamin bahwa tipe jalur pemisah sistem operasi akan digunakan secara konsisten (mis. Ini akan berubahC:\directory/test
menjadiC:\directory\test
(saat berada di Windows)fs.exists
sudah usang , itu sebabnya saya gunakanfs.stat
untuk memeriksa apakah direktori sudah adaENOENT
( E rror NO ENT ry)fs.mkdir
fs.mkdir
daripada itu memblokir mitrafs.mkdirSync
dan karena pembungkusnyaPromise
akan dijamin bahwa jalur direktori hanya akan dikembalikan setelah direktori berhasil dibuatsumber
Anda sebaiknya tidak menghitung hit sistem file saat Anda kode dalam Javascript, menurut saya. Namun, (1)
stat
&mkdir
dan (2)mkdir
dan memeriksa (atau membuang) kode kesalahan, kedua cara adalah cara yang benar untuk melakukan apa yang Anda inginkan.sumber
sumber
Anda dapat melakukan semua ini dengan modul Sistem File.
Anda bahkan tidak perlu memeriksa apakah direktori tersebut ada. Kode berikut juga menjamin bahwa direktori sudah ada atau dibuat.
sumber
Jawaban Raugaral tetapi dengan fungsionalitas -p. Jelek, tapi berhasil:
sumber
Sama seperti alternatif yang lebih baru untuk jawaban Teemu Ikonen , yang sangat sederhana dan mudah dibaca, adalah dengan menggunakan
ensureDir
metodefs-extra
paket.Itu tidak hanya dapat digunakan sebagai pengganti terang-terangan untuk
fs
modul built in , tetapi juga memiliki banyak fungsi lain selain fungsifs
paket.The
ensureDir
metode, seperti namanya, memastikan bahwa direktori ada. Jika struktur direktori tidak ada, itu dibuat. Sepertimkdir -p
. Bukan hanya folder akhir, sebaliknya seluruh jalur dibuat jika belum ada.yang disediakan di atas adalah
async
versi itu. Ini juga memiliki metode sinkron untuk melakukan ini dalam bentukensureDirSync
metode.sumber
@ Jawaban Liberateur di atas tidak bekerja untuk saya (Node v8.10.0). Sedikit modifikasi berhasil tetapi saya tidak yakin apakah ini cara yang benar. Tolong sarankan.
sumber