我一直在尝试使用简单的递归方法在 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
我一直在尝试使用简单的递归方法在 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
问题是每次递归时,传递给的路径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
对于递归,您应该使用Find:
从文档中:
Find 模块支持对一组文件路径进行自上而下的遍历。
例如,要计算主目录下所有文件的大小,忽略“点”目录中的任何内容(例如 $HOME/.ssh):
需要'查找'
总大小 = 0
Find.find(ENV["HOME"]) 做 |路径|
如果 FileTest.directory?(路径)
如果 File.basename(path)[0] == ?.
Find.prune # 不要再看这个目录了。
别的
下一个
结尾
别的
total_size += FileTest.size(路径)
结尾
结尾