如果在Ruby中使用File类时不存在,我该如何创build目录?
我有这样的说法:
File.open(some_path, 'w+') { |f| f.write(builder.to_html) }
哪里
some_path = "somedir/some_subdir/some-file.html"
我想要发生的是,如果path中没有名为somedir
或some_subdir
或两者的目录,我希望它自动创build它。
我怎样才能做到这一点?
您可以使用FileUtilsrecursion创build父目录(如果它们尚不存在):
require 'fileutils' dirname = File.dirname(some_path) unless File.directory?(dirname) FileUtils.mkdir_p(dirname) end
编辑:这是一个只使用核心库的解决scheme(重新实现轮子,不推荐)
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
对于那些正在寻找创build一个目录的方式, 如果它不存在 ,这里是简单的解决scheme:
require 'fileutils' FileUtils.mkdir_p 'dir_name'
根据尤里卡的评论 。
directory_name = "name" Dir.mkdir(directory_name) unless File.exists?(directory_name)
根据别人的答案,没有任何事情发生(没有工作)。 没有错误,也没有创build目录。
这是我需要做的:
require 'fileutils' response = FileUtils.mkdir_p('dir_name')
我需要创build一个variables来捕获FileUtils.mkdir_p('dir_name')
发回的响应…然后,所有的东西都像一个魅力!
沿着类似的路线(并根据你的结构),这是我们如何解决在哪里存储屏幕截图:
在我们的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?
答案最多的“核心库”解决scheme是不完整的。 如果您只想使用核心库,请使用以下命令:
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
我需要这个解决scheme,因为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)