8

我一直在尝试使用简单的递归方法在 Ruby 中为更大的程序的一部分实现目录遍历。但是我发现Dir.foreach不包括其中的目录。我怎样才能让他们列出来?

代码:

def walk(start)
  Dir.foreach(start) do |x|
    if x == "." or x == ".."
      next
    elsif File.directory?(x)
      walk(x)
    else
      puts x
    end
  end
end
4

2 回答 2

16

问题是每次递归时,传递给的路径File.directory?是 no 只是实体(文件或目录)名称;所有上下文都丢失了。所以说你去one/two/three/检查是否one/two/three/file.txt是一个目录,从顶级目录的角度来看,File.directory?只是作为路径而不是整个东西。"file.txt"每次递归时都必须维护相对路径。这似乎工作正常:

def walk(start)
  Dir.foreach(start) do |x|
    path = File.join(start, x)
    if x == "." or x == ".."
      next
    elsif File.directory?(path)
      puts path + "/" # remove this line if you want; just prints directories
      walk(path)
    else
      puts x
    end
  end
end
于 2013-03-29T05:51:27.163 回答
15

对于递归,您应该使用Find

从文档中:

Find 模块支持对一组文件路径进行自上而下的遍历。

例如,要计算主目录下所有文件的大小,忽略“点”目录中的任何内容(例如 $HOME/.ssh):

需要'查找'

总大小 = 0

Find.find(ENV["HOME"]) 做 |路径|
  如果 FileTest.directory?(路径)
    如果 File.basename(path)[0] == ?.
      Find.prune # 不要再看这个目录了。
    别的
      下一个
    结尾
  别的
    total_size += FileTest.size(路径)
  结尾
结尾
于 2013-03-29T05:58:52.597 回答