나는이 진술이있다 :
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
답변
존재하지 않는 경우 디렉토리 를 만드는 방법을 찾는 사람들을 위해 다음 은 간단한 솔루션입니다.
require 'fileutils'
FileUtils.mkdir_p 'dir_name'
Eureka의 의견을 기반으로 합니다.
답변
directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)
답변
다른 답변에 따르면 아무 일도 일어나지 않았습니다 (작동하지 않음). 오류가 없었고 디렉토리가 생성되지 않았습니다.
내가해야 할 일은 다음과 같습니다.
require 'fileutils'
response = FileUtils.mkdir_p('dir_name')
나는 FileUtils.mkdir_p('dir_name')
다시 보내는 응답을 잡기 위해 변수를 만들어야했습니다 . 그러면 모든 것이 매력처럼 작동했습니다!
답변
사용은 Pathname
어떻습니까?
require 'pathname'
some_path = Pathname("somedir/some_subdir/some-file.html")
some_path.dirname.mkdir_p
some_path.write(builder.to_html)
답변
유사한 선 (그리고 구조에 따라)을 따라 스크린 샷을 저장할 위치를 다음과 같이 해결했습니다.
환경 설정 (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
rmagick가 제대로 작동하려면 libmagickwand-dev (Ubuntu) / imagemagick (OSX) 패키지에 의존하기 때문에 FileUtils의 종속성 gem rmagick가 내 Rails 앱이 Amazon Web Services에 배포되는 것을 막았 기 때문에이 솔루션이 필요했습니다.