Programing

Ruby에서 File 클래스를 사용하여 디렉토리가 없으면 어떻게 디렉토리를 작성합니까?

lottogame 2020. 7. 21. 21:39
반응형

Ruby에서 File 클래스를 사용하여 디렉토리가 없으면 어떻게 디렉토리를 작성합니까?


나는이 진술을 가지고있다 :

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'

유레카의 의견을 바탕으로 합니다.


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')보내 려면 변수를 만들어야 했습니다. 모든 것이 매력처럼 작동했습니다!


유사한 라인을 따라 (그리고 구조에 따라) 스크린 샷을 저장할 위치를 다음과 같이 해결했습니다.

우리의 환경 설정에서 (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에 배포되지 못하도록했기 때문에이 솔루션이 필요했습니다.


어때요 Pathname?

require 'pathname'
some_path = Pathname("somedir/some_subdir/some-file.html")
some_path.dirname.mkdir_p
some_path.write(builder.to_html)

참고 URL : https://stackoverflow.com/questions/12617152/how-do-i-create-directory-if-none-exists-using-file-class-in-ruby

반응형