Как создать каталог, если он не существует, используя класс File в Ruby?
у меня есть такое заявление:
File.open(some_path, 'w+') { |f| f.write(builder.to_html) }
здесь
some_path = "somedir/some_subdir/some-file.html"
то, что я хочу, чтобы произошло, если нет каталога под названием somedir или some_subdir или оба в пути, я хочу, чтобы он автоматически создавал его.
как я могу это сделать?
7 ответов:
Вы можете использовать FileUtils для рекурсивного создания родительских каталогов, если они еще не присутствуют:
require 'fileutils' dirname = File.dirname(some_path) unless File.directory?(dirname) FileUtils.mkdir_p(dirname) endEdit: вот решение, использующее только основные библиотеки (переопределение колеса, не рекомендуется)
dirname = File.dirname(some_path) tokens = dirname.split(/[\/\]/) # don't forget the backslash for Windows! And to escape both "\" and "/" 1.upto(tokens.size) do |n| dir = tokens[0...n] Dir.mkdir(dir) unless Dir.exist?(dir) end
для тех, кто ищет способ создать каталог, если он не существует, вот простое решение:
require 'fileutils' FileUtils.mkdir_p 'dir_name'на основе Эврика комментарий.
основываясь на других ответах, ничего не произошло (не сработало). Ошибки не было, и каталог не был создан.
вот, что мне нужно делать:
require 'fileutils' response = FileUtils.mkdir_p('dir_name')мне нужно создать переменную, чтобы поймать ответ, который
FileUtils.mkdir_p('dir_name')отправляет обратно... тогда все работало как по маслу!
по аналогичным линиям (и в зависимости от вашей структуры), вот как мы решили, где хранить скриншоты:
в нашей установке env (env.РБ)
screenshotfolder = "./screenshots/#{Time.new.strftime("%Y%m%d%H%M%S")}" unless File.directory?(screenshotfolder) FileUtils.mkdir_p(screenshotfolder) end Before do @screenshotfolder = screenshotfolder ... endи в наших крючках.РБ
screenshotName = "#{@screenshotfolder}/failed-#{scenario_object.title.gsub(/\s+/,"_")}-#{Time.new.strftime("%Y%m%d%H%M%S")}_screenshot.png"; @browser.take_screenshot(screenshotName) if scenario.failed? embed(screenshotName, "image/png", "SCREENSHOT") if scenario.failed?
единственное решение "основной библиотеки" верхнего ответа было неполным. Если вы хотите использовать только основные библиотеки, используйте следующую конструкцию:
target_dir = "" Dir.glob("/#{File.join("**", "path/to/parent_of_some_dir")}") do |folder| target_dir = "#{File.expand_path(folder)}/somedir/some_subdir/" end # Splits name into pieces tokens = target_dir.split(/\//) # Start at '/' new_dir = '/' # Iterate over array of directory names 1.upto(tokens.size - 1) do |n| # Builds directory path one folder at a time from top to bottom unless n == (tokens.size - 1) new_dir << "#{tokens[n].to_s}/" # All folders except innermost folder else new_dir << "#{tokens[n].to_s}" # Innermost folder end # Creates directory as long as it doesn't already exist Dir.mkdir(new_dir) unless Dir.exist?(new_dir) endМне нужно было это решение, потому что зависимость от FileUtils gem rmagick помешала моему приложению Rails развертываться на Amazon Web Services, поскольку rmagick зависит от пакета libmagickwand-dev (Ubuntu) / imagemagick (OSX) для правильной работы.
Как насчет использования
Pathname?require 'pathname' some_path = Pathname("somedir/some_subdir/some-file.html") some_path.dirname.mkdir_p some_path.write(builder.to_html)
Comments