Saya mencoba membuat direktori dengan kode berikut:
Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
Namun, saya menerima kesalahan ini:
Tidak ada file atau direktori tersebut - / Pengguna / Luigi / Desktop / Survey_Final / Diarsipkan / Survei / uji (Errno :: ENOENT)
Mengapa direktori ini tidak dibuat oleh Dir.mkdir
pernyataan di atas?
File.exists?()
bekerja pada file dan folder. Tidak tahu bedanya.Jawaban:
Anda mungkin mencoba membuat direktori bersarang. Dengan asumsi
foo
tidak ada, Anda akan menerimano such file or directory
kesalahan untuk:Untuk membuat direktori bersarang sekaligus,
FileUtils
diperlukan:Sunting2: Anda tidak harus menggunakan
FileUtils
, Anda dapat melakukan panggilan sistem (pembaruan dari @mu adalah komentar terlalu pendek):Tapi itu tampaknya (setidaknya bagi saya) sebagai pendekatan yang lebih buruk karena Anda menggunakan 'alat' eksternal yang mungkin tidak tersedia pada beberapa sistem (walaupun saya tidak bisa membayangkan sistem tanpa
mkdir
, tapi siapa yang tahu).sumber
system 'mkdir', '-p', 'foo/bar'
akan menjadi versi yang lebih baik darisystem
panggilan itu. Tidak perlu untuk proses shell tambahan atau kutipan / melarikan diri / injeksi omong kosong biasa yang datang dengan versi argumen tunggalsystem
.system
akan memulai/bin/sh
untuk menguraimkdir -p "foo/bar"
string dan kemudian shell akan berjalan/bin/mkdir
. Jadi Anda melakukan pekerjaan ekstra (membuat string perintah, luncurkan/bin/sh
untuk memisahkannya lagi) dan beberapa pekerjaan tambahan itu membuat Anda terbuka untuk serangan injeksi shell (menghabiskan waktu di penasihat CERT untuk Ruby dan Anda akan melihat seberapa umum masalah ini).system
panggilan lebih baik daripadafileutils
lagi? Saya di Windows danmkdir_p
berfungsi dengan baik tanpa memunculkan subkulit hanya untuk menguraimkdir -p
yang akan gagal pula. Senang itufileutils
adalah alternatif pertama dalam jawabannya.fileutils
atau yangmkdir_p
saya katakan adalah itusystem command, arg1, arg2, ...
lebih baik daripadasystem command_with_arguments
.Cara sederhana:
sumber
Cara sederhana lain:
Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')
sumber
/home/jignesh/reports/test
tetapi menggunakan solusi ini dimunculkanRUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir
. Jadi solusi yang dapat diandalkan adalah menggunakanFileUtils.mkdir_p
Bagaimana dengan adil
Dir.mkdir('dir') rescue nil
?sumber
rescue
dalam bentuk pengubahnya.