我有这个语句:
File.open(some_path, 'w+') { |f| f.write(builder.to_html) }
何时使用?
some_path = "somedir/some_subdir/some-file.html"
我希望的是,如果路径中不存在名为somedir
或some_subdir
的目录(或两者皆无),则自动创建它们。
我该如何实现?
我有这个语句:
File.open(some_path, 'w+') { |f| f.write(builder.to_html) }
何时使用?
some_path = "somedir/some_subdir/some-file.html"
我希望的是,如果路径中不存在名为somedir
或some_subdir
的目录(或两者皆无),则自动创建它们。
我该如何实现?
如果父目录不存在,您可以使用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
FileUtils.mkdir_p(File.dirname(some_path))
”。 - Darpandirectory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)
Pathname
怎么样?require 'pathname'
some_path = Pathname("somedir/some_subdir/some-file.html")
some_path.dirname.mkdir_p
some_path.write(builder.to_html)
some_path.dirname.mkpath
而不是some_path.dirname.mkdir_p
。 - Mauro Nidolamkpath
上加上 +1。如果你只有目录而不是路径,就不需要 dirname
,例如 Pathname("somedir/some_subdir").mkpath 将以相同的方式工作。 - Michaelrequire 'fileutils'
response = FileUtils.mkdir_p('dir_name')
我需要创建一个变量来捕获FileUtils.mkdir_p('dir_name')
返回的响应...然后一切都很顺利!
response = FileUtils.mkdir_p('dir_name')
之前,逻辑并没有起作用。如果我没有创建这个变量,FileUtils.mkdir_p('dir_name')
对我来说就无法工作...或者至少我记得发生了这种情况(这个答案已经超过1年了)。如果Ruby的新版本修复了这个问题,我也不会感到惊讶。 - skplunkerin在类似的情况下(并且取决于您的结构),这是我们解决存储截图位置的方法:
在我们的环境设置中(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?
最佳答案中的“核心库”解决方案是不完整的。如果您只想使用核心库,请使用以下内容:
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)才能正常工作。
FileUtils.mkdir_p
(这是专门针对您的用例的方法)。 - EurekaFileUtils#mkdir_p
即使目录层次结构已经存在(它什么也不做),仍然可以工作,因此这个解决方案可以压缩成一个一行代码加一个require语句的形式:FileUtils.mkdir_p(File.dirname(some_path))
。 - Eureka