139

我有这样的声明:

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

在哪里

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

我想要发生的是,如果路径中没有调用目录somedirsome_subdir两者都没有,我希望它自动创建它。

我怎样才能做到这一点?

4

7 回答 7

171

如果父目录不存在,您可以使用 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
于 2012-09-27T08:42:06.200 回答
90

对于那些寻找创建目录的方法的人,如果它不存在,这里是简单的解决方案:

require 'fileutils'

FileUtils.mkdir_p 'dir_name'

基于尤里卡的评论

于 2014-05-14T07:52:36.870 回答
25
directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)
于 2015-03-03T07:36:15.650 回答
5

根据其他人的回答,什么也没发生(没用)。没有错误,也没有创建目录。

这是我需要做的:

require 'fileutils'
response = FileUtils.mkdir_p('dir_name')

我需要创建一个变量来捕获FileUtils.mkdir_p('dir_name')发回的响应......然后一切都像魅力一样!

于 2015-04-09T15:43:00.230 回答
5

怎么用Pathname

require 'pathname'
some_path = Pathname("somedir/some_subdir/some-file.html")
some_path.dirname.mkdir_p
some_path.write(builder.to_html)
于 2017-10-13T19:10:32.990 回答
1

沿着类似的思路(并且取决于您的结构),这就是我们解决屏幕截图存储位置的方法:

在我们的环境设置(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?
于 2014-06-02T14:08:42.180 回答
1

最佳答案的“核心库”唯一解决方案不完整。如果您只想使用核心库,请使用以下内容:

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) 才能正常工作。

于 2016-12-04T23:12:31.617 回答