【问题标题】:How to create directories recursively in ruby?如何在 ruby​​ 中递归地创建目录?
【发布时间】:2011-04-10 19:19:31
【问题描述】:

我想将文件存储为 /a/b/c/d.txt,但我不知道这些目录是否存在,如果需要,需要递归创建它们。 如何在 ruby​​ 中做到这一点?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    使用 mkdir_p 递归创建目录

    path = "/tmp/a/b/c"
    
    FileUtils.mkdir_p(path) unless File.exists?(path)
    

    【讨论】:

      【解决方案2】:

      Pathname 来救援!

      Pathname('/a/b/c/d.txt').dirname.mkpath
      

      【讨论】:

      • 这不像公认的答案那么直观。还有该方法的文档转发到 FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
      • 问题是:“我想将文件存储为/a/b/c/d.txt,但我不知道这些目录是否存在”。我的解决方案允许使用现有的文件路径('/a/b/c/d.txt'),并且无需单独解析,创建所有文件夹。
      • 你的意思是这允许同时做FileUtils.mkdir_p '/a/b/c' + 创建d.txt
      • 不,相反,它允许 Pathname('/a/b/c/d.txt').dirname.mkpathFile.write('/a/b/c/d.txt', content) 没有 filename = '/a/b/c/d.txt'.rpartition('/').last 和其余的解析
      【解决方案3】:

      使用mkdir_p:

      FileUtils.mkdir_p '/a/b/c'
      

      _p 是父/路径的 unix 保留,如果这对您更有意义,您也可以使用别名 mkpath

      FileUtils.mkpath '/a/b/c'
      

      在 Ruby 1.9 中,FileUtils 已从核心中移除,因此您必须使用 require 'fileutils'

      【讨论】:

      • +1。 FileUtilsPathname 可能是 Ruby shell 脚本最重要的工具。
      【解决方案4】:

      你也可以使用你自己的逻辑

      def self.create_dir_if_not_exists(path)
        recursive = path.split('/')
        directory = ''
        recursive.each do |sub_directory|
          directory += sub_directory + '/'
          Dir.mkdir(directory) unless (File.directory? directory)
        end
      end
      

      所以如果路径是 'tmp/a/b/c' 如果 'tmp' 不存在,则创建 'tmp',然后创建 'tmp/a/' 等等。

      【讨论】:

      • 避免重新发明轮子。
      【解决方案5】:

      如果您在 unixy 机器上运行,请不要忘记您始终可以在 ruby​​ 下运行 shell 命令,方法是将其放在反引号中。

      `mkdir -p /a/b/c`
      

      【讨论】:

      • 虽然如此积极。
      • 将系统命令弹出到子进程中并不是最好的主意。最好使用 Ruby 标准库来进行错误处理、检查结果等。
      【解决方案6】:
       require 'ftools'
      

      File.makedirs

      【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2011-09-08
      • 2011-10-10
      • 2017-08-13
      • 1970-01-01
      • 2010-12-16
      • 2012-06-12
      • 2011-03-20
      相关资源
      最近更新 更多