Ruby'de yinelemeli dizinler nasıl oluşturulur?


102

Bir dosyayı /a/b/c/d.txt olarak depolamak istiyorum, ancak bu dizinlerden herhangi birinin var olup olmadığını bilmiyorum ve gerekirse bunları yinelemeli olarak oluşturmam gerekiyor. Bunu yakutla nasıl yapabiliriz?

Yanıtlar:


198

Kullanım mkdir_p:

FileUtils.mkdir_p '/a/b/c'

_pAyrıca takma kullanabilirsiniz ebeveyn / yolu için bir unix kalmadır mkpathsizin için daha mantıklı eğer.

FileUtils.mkpath '/a/b/c'

Ruby 1.9'da FileUtils çekirdekten kaldırıldı, bu yüzden yapmanız gerekecek require 'fileutils'.


9
+1. FileUtilsve Pathnamemuhtemelen Yakut kabuk komut dosyası için en önemli araçları.
Jörg W Mittag

21

Özyinelemeli dizin oluşturmak için mkdir_p kullanın

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

FileUtils.mkdir_p(path) unless File.exists?(path)

6

Unixy makinelerde çalışıyorsanız, ruby ​​altında her zaman bir kabuk komutunu geri işaretlere yerleştirerek çalıştırabileceğinizi unutmayın.

`mkdir -p /a/b/c`

Bu kadar pozitif olmak olsa da.
Matthew Schinckel

1
Sistem komutunu alt sürece dahil etmek en iyi fikir değildir. Hata işlemeyi elde etmek, sonucu kontrol etmek vb. İçin Ruby standart kitaplığıyla yapmak daha iyidir
noraj


2

Kurtarma yolunun adı !

Pathname('/a/b/c/d.txt').dirname.mkpath

Bu, kabul edilen cevaptan daha az sezgiseldir. Ayrıca, yöntemin dokümanı FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
noraj

Soru şudur: "Bir dosyayı /a/b/c/d.txt olarak saklamak istiyorum, ancak bu dizinlerden herhangi birinin var olup olmadığını bilmiyorum". Çözümüm, mevcut dosya yolunu ('/a/b/c/d.txt') kullanmaya ve ayrı ayrıştırmadan tüm klasörleri oluşturmaya izin veriyor.
Vadym Tyemirov

Bunun aynı anda FileUtils.mkdir_p '/a/b/c'+ oluşturmaya + izin vermesini mi söylüyorsunuz d.txt?
noraj

Hayır, bunun yerine ayrıştırmanın geri kalanına izin veriyor Pathname('/a/b/c/d.txt').dirname.mkpathve File.write('/a/b/c/d.txt', content)yokfilename = '/a/b/c/d.txt'.rpartition('/').last
Vadym Tyemirov

0

Ayrıca kendi mantığınızı da kullanabilirsiniz

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

Dolayısıyla, yol 'tmp / a / b / c' ise, 'tmp' yoksa 'tmp' oluşturulur, ardından 'tmp / a /' vb.


Tekerleği yeniden icat etmekten kaçınılır.
noraj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.