如果在Ruby中使用File类时不存在,我该如何创build目录?

我有这样的说法:

File.open(some_path, 'w+') { |f| f.write(builder.to_html) } 

哪里

 some_path = "somedir/some_subdir/some-file.html" 

我想要发生的是,如果path中没有名为somedirsome_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)