所以我在这里有一个函数,应该将archive.zip的路径作为参数,并递归地潜入每个子目录,直到找到扩展名为.html的文件
def path_to_project
"#{recursive_find(File.dirname(self.folder.path))}"
end
path_to_project用于将此recursive_find进程动态应用为字符串,因为它在整个过程中重复使用。
def recursive_find(proj_path)
Dir.glob("#{proj_path}/*") do |object_path|
if object_path.split(".").last == "html"
@found_it = File.dirname(object_path)
else
recursive_find(object_path)
end
end
@found_it
end
无论如何,对于stackoverflow的聪明人,我有两个问题 -
1-我对@found_it实例变量的使用是否正确? ,也许我应该使用attr_accessor:found_it代替?显然命名其他不傻的东西..也许:html_file。
也许 -
unless @found_it
# do the whole recursive thing
end
return @found_it
# I don't actually have to return the variable right?
2 - 我的递归方法可以更好吗?我意识到这是非常开放的,所以无论如何,要把愤怒的居民熄灭。我很乐意接受你的严厉批评,并全心全意地感谢你的好建议:)
答案 0 :(得分:1)
如果您不需要使用递归,则可以执行
Dir["#{proj_path}"/**/*.html"]
这应该会为您提供所有html
扩展名的文件列表。
就你的问题而言:你对@found_it
的使用取决于更大的范围。这个函数在哪里定义了一个类或一个模块?变量本身的名称可能更有意义,如@html_file
,或者文件的上下文可能是@result_page
。
答案 1 :(得分:0)
Ruby的Find类是一个非常易于使用且可扩展的解决方案。它下降到目录层次结构中,在遇到时返回每个元素。您可以告诉它递归到特定目录,忽略基于属性的文件和目录,并且它非常快。
这是文档中的示例:
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
我用它来扫描包含数千个文件的目录。它很容易就像使用glob一样快。