Как создать каталог, если он не существует с помощью класса File в Ruby?
У меня есть это утверждение:
File.open(some_path, 'w+') { |f| f.write(builder.to_html) }
Где
some_path = "somedir/some_subdir/some-file.html"
То, что я хочу, - это если нет каталога с именем somedir
или some_subdir
или обоих в пути, я хочу, чтобы он автоматически его создал.
Как я могу это сделать?
Ответы
Ответ 1
Вы можете использовать FileUtils для рекурсивного создания родительских каталогов, если они еще не присутствуют:
require 'fileutils'
dirname = File.dirname(some_path)
unless File.directory?(dirname)
FileUtils.mkdir_p(dirname)
end
Изменить: вот решение, использующее только основные библиотеки (переопределение диска, не рекомендуется)
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
Ответ 2
Для тех, кто ищет способ создать каталог, если он не существует, здесь простое решение:
require 'fileutils'
FileUtils.mkdir_p 'dir_name'
На основе Eureka comment.
Ответ 3
directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)
Ответ 4
На основании других ответов ничего не произошло (не получилось). Не было ошибок, и никакой каталог не был создан.
Вот что мне нужно сделать:
require 'fileutils'
response = FileUtils.mkdir_p('dir_name')
Мне нужно было создать переменную, чтобы поймать ответ, который отправляет FileUtils.mkdir_p('dir_name')
... тогда все работало как шарм!
Ответ 5
Вдоль аналогичных строк (и в зависимости от вашей структуры), так мы решили, где хранить скриншоты:
В нашей программе env (env.rb)
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
И в нашем hooks.rb
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?
Ответ 6
Решение "только для основной библиотеки" было неполным. Если вы хотите использовать только основные библиотеки, используйте следующее:
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 rmagick помешал моему Rails-приложению развертываться на Amazon Web Services, так как rmagick зависит от того, что пакет libmagickwand-dev (Ubuntu)/imagemagick (OSX) работает правильно.
Ответ 7
Как насчет использования Pathname
?
require 'pathname'
some_path = Pathname("somedir/some_subdir/some-file.html")
some_path.dirname.mkdir_p
some_path.write(builder.to_html)