2012-09-27 2 views

답변

107

당신은 이미 존재하지 않는 경우 재귀 적 부모 디렉토리를 만들 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 
+4

Fileutils의 다음 stdlib에서 : http://www.ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html – Eureka

+0

확인 아. 나는 stdlib가 아니라 핵심을 의미했습니다. 어느 쪽이든 괜찮습니다. 이 작동합니다. 감사! – marcamillion

+1

필자는 내 대답에 핵심적인 해결책을 추가했습니다. 그러나 본질적으로'FileUtils.mkdir_p' (이는 유스 케이스 전용 메서드입니다)를 다시 작성 함을 알아 두십시오. – Eureka

54

, 여기에 간단한 해결책이다 :

require 'fileutils' 

FileUtils.mkdir_p 'dir_name' 

유레카의 comment 기준. 비슷한 라인을 따라

1

,이 스크린 샷을 저장할 위치를 우리가 해결하는 방법이다 (당신의 구조에 따라) : 우리의 ENV 설정에서

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 

그리고 우리의 후크에서 (env.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? 
15
directory_name = "name" 
Dir.mkdir(directory_name) unless File.exists?(directory_name) 
+0

이 메서드를 사용하여 경쟁 조건이 발생할 수 있습니다. File.exists 뒤에 디렉터리를 만들 수 있습니까? Dir.mkdir이 실행되기 전에 실행됩니다. –

3

을 기반 RB, 아무것도 (작동하지 않았다) 일어나지 않았다. 오류가 없었으며 디렉토리도 생성되지 않았습니다.

가 여기에 내가 할 필요가 무엇 :

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

내가 FileUtils.mkdir_p('dir_name') 다시 보내는 응답을 잡으려고 변수를 만드는 데 필요한 ... 다음 모든 마법처럼 일했다!

+0

은 의미가 없습니다. 왜 당신은 수익을 잡을 필요가 있습니까? –

+0

@huanson, 나는 return을 잡을 필요가 없었습니다. 그러나'response = FileUtils.mkdir_p ('dir_name')'을 만들 때까지는 로직이 작동하지 않았습니다. 이 변수를 만들지 않았다면,'FileUtils.mkdir_p ('dir_name')'이 나에게 효과가 없었습니다 ... 적어도 기억 나는 것은 1 년이 넘었습니다. 나는 새로운 버전의 Ruby가이 문제를 해결하면 놀랄 일이 아니다. – skplunkerin

1

맨 위로 대답의 "핵심 라이브러리"유일한 해결책은 불완전합니다. (Fileutils의 '종속 보석 rmagick 아마존 웹 서비스에 배포하는 내 레일 응용 프로그램을 방지하기 때문에 rmagick는 패키지 libmagickwand-DEV에 의존하기 때문에

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 

내가이 솔루션을 필요로 : 당신은 단지 핵심 라이브러리를 사용하려면, 다음을 사용 우분투)/imagemagick (OSX) 제대로 작동합니다.

0

사용 방법은 Pathname일까요? ** **입니다

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