139

私はこの声明を持っています:

File.open(some_path, 'w+') { |f| f.write(builder.to_html)  }

どこ

some_path = "somedir/some_subdir/some-file.html"

私がしたいのは、パスにディレクトリが存在しないsomedirか、またはsome_subdirその両方が存在しない場合、自動的に作成することです。

どうやってやるの?

4

7 に答える 7

171

親ディレクトリがまだ存在しない場合は、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
于 2012-09-27T08:42:06.200 に答える
90

ディレクトリが存在しない場合にディレクトリを作成する方法を探している人のために、簡単な解決策を次に示します。

require 'fileutils'

FileUtils.mkdir_p 'dir_name'

エウレカのコメントに基づく。

于 2014-05-14T07:52:36.870 に答える
25
directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)
于 2015-03-03T07:36:15.650 に答える
5

他の回答に基づいて、何も起こりませんでした(機能しませんでした)。エラーはなく、ディレクトリは作成されませんでした。

これが私がしなければならなかったことです:

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

FileUtils.mkdir_p('dir_name')送り返す応答をキャッチする変数を作成する必要がありました...その後、すべてが魅力的に機能しました!

于 2015-04-09T15:43:00.230 に答える
1

一番上の回答の「コア ライブラリ」のみのソリューションは不完全でした。コア ライブラリのみを使用する場合は、次を使用します。

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 の依存性 gem rmagick が適切に動作するためにパッケージ libmagickwand-dev (Ubuntu) / imagemagick (OSX) に依存しているため、rmagick によって Rails アプリが Amazon Web Services にデプロイされないため、このソリューションが必要でした。

于 2016-12-04T23:12:31.617 に答える