回答
的問題是,每次遞歸的時候,你傳遞給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. 目錄遍歷問題c#
- 11. 使用Node.js遍歷目錄
- 12. 遍歷目錄路徑
- 13. 通過http遍歷目錄
- 14. 目錄遍歷bash shell
- 15. 遞歸目錄遍歷
- 16. Perl子目錄遍歷
- 17. 目錄遍歷攻擊
- 18. 用Gulp遍歷目錄?
- 19. 遍歷目錄使用Java
- 20. Unix:遍歷一個目錄
- 21. 笨 - 目錄遍歷 - sanitize_filename()
- 22. 如何遍歷Ant中的目錄
- 23. 遍歷Makefile中的目錄列表
- 24. 如何遍歷目錄中的文件?
- 25. perl中的遞歸目錄遍歷
- 26. 目錄遍歷在java中的擴展
- 27. C++遍歷目錄中的文件
- 28. 如何遍歷Common Lisp中的目錄?
- 29. 通過Java中的目錄遍歷
- 30. c中的迭代目錄遍歷
代替'Dir.foreach',你可以使用'Dir.glob(start)'或者'Dir [start]'。 –
你想跳過'.'和'..'嗎?並且想要在'walk(start)'的每個調用中的'start'中遍歷其他人? –
@iAmRubuuu是的,以避免無限遞歸。 – squiguy