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.