回答
的问题是,每次递归的时候,你传递给File.directory?
的路径是不只是实体(文件或目录)的名称;所有上下文都会丢失。因此,假设你进入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:
从文档:
的查找模块支持一组文件路径的自顶向下穿越。
例如,以总价所有文件的大小,你的主目录下,在一个“点”目录忽略任何东西(如$ HOME /的.ssh):
require 'find' total_size = 0 Find.find(ENV["HOME"]) do |path| if FileTest.directory?(path) if File.basename(path)[0] == . Find.prune # Don't look any further into this directory. else next end else total_size += FileTest.size(path) end end
很好找。我从来不知道这件事。 – squiguy
尝试以下:
这不会递归地遍历目录。目录检查需要路径,并且该路径应该在递归调用中传递,以便后续的Dir.entries调用工作。 x = File.join(start,x)应该遵循Dir.entries .... –
- 1. 遍历目录
- 2. 遍历目录
- 3. 遍历目录树
- 4. R:遍历目录
- 5. Applescript遍历目录
- 6. 目录遍历c
- 7. perl的遍历目录
- 8. 目录遍历攻击
- 9. 用php遍历目录?
- 10. 用Gulp遍历目录?
- 11. 通过http遍历目录
- 12. Unix:遍历一个目录
- 13. Perl子目录遍历
- 14. 递归目录遍历
- 15. 目录遍历bash shell
- 16. 笨 - 目录遍历 - sanitize_filename()
- 17. 遍历目录路径
- 18. 使用Node.js遍历目录
- 19. 目录遍历问题c#
- 20. 如何遍历目录中的文件?
- 21. C++遍历目录中的文件
- 22. 遍历Makefile中的目录列表
- 23. 如何遍历Common Lisp中的目录?
- 24. perl中的递归目录遍历
- 25. 目录遍历在java中的扩展
- 26. 通过Java中的目录遍历
- 27. 如何遍历Ant中的目录
- 28. c中的迭代目录遍历
- 29. 在ruby中循环遍历
- 30. Ruby - 遍历实例
代替'Dir.foreach',你可以使用'Dir.glob(start)'或者'Dir [start]'。 –
你想跳过'.'和'..'吗?并且想要在'walk(start)'的每个调用中的'start'中遍历其他人? –
@iAmRubuuu是的,以避免无限递归。 – squiguy