如何在Ruby中分割一个目录string?

ruby,我能够做到

File.dirname("/home/gumby/bigproject/now_with_bugs_fixed/32/FOO_BAR_2096.results") 

并得到

 "/home/gumby/bigproject/now_with_bugs_fixed/32" 

但现在我想将目录string拆分成单独的文件夹组件,即类似的东西

 ["home", "gumby", "bigproject", "now_with_bugs_fixed", "32"] 

有没有办法做,而不是使用

 directory.split("/")[1:-1] 

Solutions Collecting From Web of "如何在Ruby中分割一个目录string?"

没有内建函数可以将路径分解为组件目录,就像加入它们一样,但是您可以尝试以跨平台的方式将其伪装:

 directory_string.split(File::SEPARATOR) 

这可以在相对路径和非Unix平台上工作,但是对于以"/"开头的路径作为根目录,那么将会得到一个空字符串作为数组中的第一个元素,我们希望"/"而是。

 directory_string.split(File::SEPARATOR).map {|x| x=="" ? File::SEPARATOR : x} 

如果你只想要没有像上面提到的根目录的目录,那么你可以改变它从第一个元素选择。

 directory_string.split(File::SEPARATOR).map {|x| x=="" ? File::SEPARATOR : x}[1..-1] 

正确的答案是使用Ruby的Pathname (自1.8.7以来的内置类,而不是宝石)。

看代码:

 require 'pathname' def split_path(path) Pathname(path).each_filename.to_a end 

这样做会丢弃路径是绝对还是相对的信息。 要检测这个,你可以调用absolute? 方法的Pathname

来源: https : //ruby-doc.org/stdlib-2.3.3/libdoc/pathname/rdoc/Pathname.html

Rake提供了一个添加到FileUtils的split_all方法。 这很简单,使用File.split:

 def split_all(路径)
  头,尾= File.split(路径)
  返回[尾]如果头=='。  ||  tail =='/'
  返回[head,tail]如果head =='/'
  返回split_all(head)+ [tail]
结束

取自rake-0.9.2 / lib / rake / file_utils.rb

Rake版本与Rudd代码的输出略有不同。 Rake的版本忽略了多个斜杠:

 irb(main):014:0> directory_string =“/foo/bar///../fn”
 =>“/foo/bar///../fn”
 irb(main):015:0> directory_string.split(File :: SEPARATOR).map {| x |  x ==“”?  File :: SEPARATOR:x} [1 ..- 1]
 => [“foo”,“bar”,“/”,“/”,“..”,“fn”]
 irb(main):016:0> split_all directory_string
 => [“/”,“foo”,“bar”,“..”,“fn”]
 IRB(主):017:0>

警告:该解决方案不再是最好的解决方案。 看到我的另一个。

事实上,有一个更加完善的解决方案。 主要想法是不断弹出的基名,直到你只剩下了./

 def split_path(path) array = [] until ['/', '.'].include? path array << File.basename(path) path = File.dirname(path) end array.reverse end split_path 'a/b/c/d' #=> ['a', 'b', 'c', 'd'] 

如果你愿意,你可以进一步建立在这个想法上。