私はこの声明を持っています:
File.open(some_path, 'w+') { |f| f.write(builder.to_html) }
どこ
some_path = "somedir/some_subdir/some-file.html"
私がしたいのは、パスにディレクトリが存在しないsomedir
か、またはsome_subdir
その両方が存在しない場合、自動的に作成することです。
どうやってやるの?
私はこの声明を持っています:
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')
送り返す応答をキャッチする変数を作成する必要がありました...その後、すべてが魅力的に機能しました!
一番上の回答の「コア ライブラリ」のみのソリューションは不完全でした。コア ライブラリのみを使用する場合は、次を使用します。
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 にデプロイされないため、このソリューションが必要でした。