Bagaimana cara membuat direktori secara rekursif di ruby?

101

Saya ingin menyimpan file sebagai /a/b/c/d.txt, tetapi saya tidak tahu apakah salah satu direktori ini ada dan perlu membuatnya secara rekursif jika perlu. Bagaimana seseorang bisa melakukan ini di ruby?

Jan
sumber

Jawaban:

197

Penggunaan mkdir_p:

FileUtils.mkdir_p '/a/b/c'

Ini _padalah sisa unix untuk induk / jalur Anda juga dapat menggunakan alias mkpathjika itu lebih masuk akal bagi Anda.

FileUtils.mkpath '/a/b/c'

Di Ruby 1.9 FileUtils telah dihapus dari inti, jadi Anda harus melakukannya require 'fileutils'.

Kayu Harmon
sumber
9
+1. FileUtilsdan Pathnamemungkin yang alat yang paling penting untuk Ruby shell scripting.
Jörg W Mittag
21

Gunakan mkdir_p untuk membuat direktori secara rekursif

path = "/tmp/a/b/c"

FileUtils.mkdir_p(path) unless File.exists?(path)
ferbass.dll
sumber
5

Jika Anda menjalankan pada mesin unixy, jangan lupa Anda selalu dapat menjalankan perintah shell di bawah ruby ​​dengan menempatkannya di backticks.

`mkdir -p /a/b/c`
Matthew Schinckel
sumber
Menjadi begitu positif.
Matthew Schinckel
1
Memunculkan perintah sistem ke dalam sub-proses bukanlah ide terbaik. Lebih baik melakukannya dengan pustaka standar Ruby untuk mendapatkan penanganan kesalahan, memeriksa hasilnya, dll.
noraj
2

Pathname untuk menyelamatkan!

Pathname('/a/b/c/d.txt').dirname.mkpath
Vadym Tyemirov
sumber
Ini kurang intuitif daripada jawaban yang diterima. Juga dokumen untuk metode diteruskan ke FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
noraj
Pertanyaannya adalah: "Saya ingin menyimpan file sebagai /a/b/c/d.txt, tetapi saya tidak tahu apakah ada direktori ini". Solusi saya memungkinkan untuk menggunakan jalur file yang ada ('/a/b/c/d.txt'), dan, tanpa parsing terpisah, buat semua folder.
Vadym Tyemirov
Maksud Anda ini memungkinkan untuk melakukan FileUtils.mkdir_p '/a/b/c'+ membuat d.txtpada saat yang sama?
noraj
Tidak, alih-alih mengizinkan Pathname('/a/b/c/d.txt').dirname.mkpathdan File.write('/a/b/c/d.txt', content)tanpa filename = '/a/b/c/d.txt'.rpartition('/').lastdan sisa penguraian
Vadym Tyemirov
0

Anda juga bisa menggunakan logika Anda sendiri

def self.create_dir_if_not_exists(path)
  recursive = path.split('/')
  directory = ''
  recursive.each do |sub_directory|
    directory += sub_directory + '/'
    Dir.mkdir(directory) unless (File.directory? directory)
  end
end

Jadi jika path adalah 'tmp / a / b / c' jika 'tmp' tidak ada 'tmp' dibuat, maka 'tmp / a /' dan seterusnya dan seterusnya.

kamal patwa
sumber
Seseorang akan menghindari untuk menemukan kembali roda.
noraj