如何在不更改当前目录的情况下获取下一个和上一个目录的完整路径名?

时间:2013-01-28 13:14:51

标签: ruby

我尝试过以下操作,这有助于我看到1-level down directory path

E:\WIPData\Ruby\Scripts>irb
irb(main):001:0> Dir.pwd
=> "E:/WIPData/Ruby/Scripts"
irb(main):004:0> Dir.pwd.gsub(/\/Scripts/,'')
=> "E:/WIPData/Ruby"
irb(main):005:0>

有没有办法让directory full path 升级 升级 < / strong>,从当前目录中不改变它?

              File structure
             =================

             Dir-> E:\WIPData\
                   |                     
            (E:\WIPData\Ruby)      
                    |
  --------------------------------------------------
  |          |           |       |                 |
(xxx)     (yyyy)      (zzzz)   (pppp)       (E:\WIPData\Ruby\Scripts) <= It is PWD

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式在当前目录中找到第一个subDirectory:

Dir.glob('*').find { |fn| File.directory?(fn) }
但是,正如有人所说,它并不是唯一的定义。

和第一个父目录这样:

File.expand_path("..", Dir.pwd)

HTH

答案 1 :(得分:1)

要从路径获取父目录,请使用:

File.dirname('/path/to/a/file.txt')
=> "/path/to/a"

除非只有一个子目录,否则无法获取“子”目录,因为文件系统没有默认子目录的概念。如果只有一个,那么这对你来说是一个明显的选择,而不是你的代码。仅获取子目录列表:

Dir.entries('.').select{ |e| File.directory?(e) }

这会将'.'下的子目录(当前目录为AKA)作为数组返回,该数组至少为['.', '..'],分别表示当前目录和父目录。例如,在我的pry实例运行的当前目录中,我回来了:

[".", "..", ".svn", "old"]

作为可用目录的列表。哪个是默认值?我能做到这一点:

Dir.entries('.').select{ |e| File.directory?(e) && !e[/^\./] }
=> ["old"]

返回唯一的“可见”目录,即它不是“隐藏”目录,因为它不以'.'开头。这不是默认值,因为正如我所说,文件系统没有“默认”子目录概念。在另一个目录中,我可能会看到许多目录被返回,所以我必须指定要下载哪个目录,或者用于文件访问。

Ruby有一套很好的FileDir工具,加上Find类,所以请仔细阅读他们的文档,看看你能做些什么。