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?

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'.


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)

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`

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

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.


Seseorang akan menghindari untuk menemukan kembali roda.
— noraj
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.