如果在Ruby中使用File类不存在目录,如何创建目录?

mar*_*ion 117 ruby

我有这样的声明:

File.open(some_path, 'w+') { |f| f.write(builder.to_html)  }
Run Code Online (Sandbox Code Playgroud)

哪里

some_path = "somedir/some_subdir/some-file.html"
Run Code Online (Sandbox Code Playgroud)

我希望发生的是,如果没有所谓的目录somedirsome_subdir或两者的路径,我希望它自动地创建它.

我怎样才能做到这一点?

Eur*_*eka 148

您可以使用FileUtils递归创建父目录(如果它们尚不存在):

require 'fileutils'

dirname = File.dirname(some_path)
unless File.directory?(dirname)
  FileUtils.mkdir_p(dirname)
end
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个仅使用核心库的解决方案(重新实现轮,不推荐)

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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`FileUtils #mkdir_p`即使目录层次结构已经存在(它什么都不做)也可以工作,所以这个解决方案可以压缩成一行,加上一个require语句:`FileUtils.mkdir_p(File.dirname(some_path)) ` (55认同)
  • FileUtils**在stdlib中是**:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html (4认同)
  • @JosephK - 对我来说这个(误导性的)EEXIST 错误最终是一个权限问题。 (2认同)

And*_*aus 73

对于那些寻找创建目录的方法(如果它不存在),这是一个简单的解决方案:

require 'fileutils'

FileUtils.mkdir_p 'dir_name'
Run Code Online (Sandbox Code Playgroud)

根据尤里卡的评论.


小智 19

directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)
Run Code Online (Sandbox Code Playgroud)

  • 使用此方法可能会遇到竞争条件,是否可以在 File.exists 之后创建目录?运行但在 Dir.mkdir 执行之前。 (2认同)

skp*_*rin 5

根据其他人的答案,什么也没发生(不起作用)。没有错误,也没有创建目录。

这是我需要做的:

require 'fileutils'
response = FileUtils.mkdir_p('dir_name')
Run Code Online (Sandbox Code Playgroud)

我需要创建一个变量来捕捉FileUtils.mkdir_p('dir_name')发回的响应......然后一切都像魅力一样!


iro*_*and 5

怎么用Pathname

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

  • 它适用于 `some_path.dirname.mkpath` 而不是 `some_path.dirname.mkdir_p` (2认同)
  • 在`mkpath`上+1。另外,如果您只有目录而不是路径,则不需要 `dirname`,例如 Pathname("somedir/some_subdir").mkpath 将以相同的方式工作。 (2认同)