Як створювати каталоги рекурсивно в рубіні?


101

Я хочу зберігати файл у форматі /a/b/c/d.txt, але я не знаю, чи існує якийсь із цих каталогів і потрібно, якщо потрібно, створювати їх рекурсивно. Як можна це зробити в рубіні?

Відповіді:


197

Використання mkdir_p:

FileUtils.mkdir_p '/a/b/c'

_pЄ пережитком Unix для батьків / шляху , який ви також можете використовувати псевдонім , mkpathякщо це має сенс для вас.

FileUtils.mkpath '/a/b/c'

У Ruby 1.9 FileUtils був видалений з ядра, тому вам доведеться це зробити require 'fileutils'.


9
+1. FileUtilsі Pathname, мабуть, є найважливішим інструментом для сценаріїв оболонок Ruby.
Йорг W Міттаг

21

Використовуйте mkdir_p, щоб створювати каталог рекурсивно

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

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

5

Якщо ви працюєте на unixy-машинах, не забувайте, що ви завжди можете запустити команду оболонки під рубіном, розмістивши її в задній панелі.

`mkdir -p /a/b/c`

Бути таким позитивним, хоча.
Метью Шинкель

1
Командування системи Poping в підпроцес - не найкраща ідея. Краще зробити це зі стандартною бібліотекою Ruby, щоб отримати помилки, перевірити результат тощо
noraj


2

Шлях до допомоги!

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

Це менш інтуїтивно, ніж прийнята відповідь. Також документ про метод переслати на FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
noraj

Питання: "Я хочу зберігати файл як /a/b/c/d.txt, але я не знаю, чи існує якийсь із цих каталогів". Моє рішення дозволяє використовувати існуючий шлях до файлу ('/a/b/c/d.txt') і, без окремого розбору, створювати всі папки.
Вадим Тиєміров

Ви маєте на увазі, що це дозволяє одночасно робити FileUtils.mkdir_p '/a/b/c'+ створювати d.txt?
noraj

Ні, натомість це дозволяє Pathname('/a/b/c/d.txt').dirname.mkpathі File.write('/a/b/c/d.txt', content)без filename = '/a/b/c/d.txt'.rpartition('/').lastрешти розбору
Вадим Тиєміров

0

Ви також можете використовувати власну логіку

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

Отже, якщо шлях дорівнює 'tmp / a / b / c', якщо 'tmp' не існує, 'tmp' створюється, тоді 'tmp / a /' і так далі і так далі.


Не можна було б винаходити колесо.
noraj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.