2012-09-27 10 views

Odpowiedz

107

Można użyć fileutils rekursywnie utworzyć katalogi nadrzędne, jeżeli nie są one już obecne:

require 'fileutils' 

dirname = File.dirname(some_path) 
unless File.directory?(dirname) 
    FileUtils.mkdir_p(dirname) 
end 

EDIT: Oto rozwiązanie przy użyciu biblioteki rdzenia tylko (reimplementing koło, nie zalecane)

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 ** ** jest w stdlib: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html – Eureka

+0

Oh ok. Miałem na myśli rdzeń, a nie stdlib. Tak czy inaczej, w porządku. To działa. Dzięki! – marcamillion

+1

Do mojej odpowiedzi dodałem rozwiązanie typu "core only": pamiętaj jednak, że zasadniczo reimplementuje 'FileUtils.mkdir_p' (która jest metodą dedykowaną do twojego przypadku użycia) – Eureka

54

dla tych, którzy szukają sposobu na utworzyć katalog, jeśli nie istnieje, oto proste rozwiązanie:

require 'fileutils' 

FileUtils.mkdir_p 'dir_name' 

Na podstawie Eureka's comment.

1

Wzdłuż podobnych linii (w zależności od struktury), to w jaki sposób rozwiązano gdzie przechowywać zdjęcia:

w naszej konfiguracji env (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 

iw naszych haków. 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

Możesz uruchomić warunki wyścigu, korzystając z tej metody, katalog może zostać utworzony po File.istists? działa, ale przed wykonaniem polecenia Dir.mkdir. –

3

podstawie innych odpowiedzi, nic się nie stało (nie działa). Nie wystąpił błąd i nie utworzono katalogu.

Oto, co potrzebne do zrobienia:

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

musiałem utworzyć zmienną złapać odpowiedź że FileUtils.mkdir_p('dir_name') odsyła ... potem wszystko działało jak urok!

+0

nie ma sensu. dlaczego musisz złapać zwrot? –

+0

@huanson, nie musiałem łapać zwrotu ... ale logika nie działała, dopóki nie stworzyłem 'response = FileUtils.mkdir_p ('dir_name')'. Jeśli nie utworzyłem tej zmiennej, 'FileUtils.mkdir_p ('dir_name')' nie działało dla mnie ... lub przynajmniej tak to sobie przypomniałem (ta odpowiedź jest starsza niż 1 rok). Nie zdziwiłbym się, gdyby nowsza wersja Ruby rozwiązała ten problem. – skplunkerin

1

Rozwiązanie "tylko z biblioteką rdzeniową" dla najważniejszej odpowiedzi było niekompletne. Jeśli chcesz korzystać tylko z podstawowych bibliotek, należy użyć następujących:

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 

Potrzebowałem tego rozwiązania, ponieważ zależność gem rmagick fileutils' zapobiega mojej aplikacji Rails z wdrażania na Amazon Web Services od rmagick zależy od pakietu libmagickwand-dev (Ubuntu)/imagemagick (OSX) do poprawnego działania.

0

Jak korzystać z Pathname?

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