Ruby on rails Rails中的递归目录搜索
因此,我这里有一个函数,它应该以archive.zip的路径作为参数,递归地深入到每个子目录,直到找到一个扩展名为.html的文件Ruby on rails Rails中的递归目录搜索,ruby-on-rails,ruby,recursion,Ruby On Rails,Ruby,Recursion,因此,我这里有一个函数,它应该以archive.zip的路径作为参数,递归地深入到每个子目录,直到找到一个扩展名为.html的文件 def path_to_project "#{recursive_find(File.dirname(self.folder.path))}" end path_to_项目用于将这个递归的_find进程作为字符串动态应用,因为它作为一个整体在进程中重复使用 def recursive_find(proj_path) Dir.glob("#{proj
def path_to_project
"#{recursive_find(File.dirname(self.folder.path))}"
end
path_to_项目用于将这个递归的_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\u it实例变量是否正确,也许我应该使用attr\u访问器:find\u it?很明显,他还提到了一些不愚蠢的东西。。也许:html_文件
或许-
unless @found_it
# do the whole recursive thing
end
return @found_it
# I don't actually have to return the variable right?
2-我的递归方法能更好吗?我意识到这是非常开放的,所以无论如何,把你们这些愤怒的居民赶走。我很高兴接受你的严厉批评,并衷心感谢你的好建议:)如果你不需要使用递归,你可以这样做
Dir[“#{proj\u path}”/**/*.html”
它将为您提供扩展名为html
的所有文件的列表
至于你的问题:你对@found\u it
的使用取决于更大的范围。这个函数在哪里定义了一个类或模块?变量本身的名称可能更有意义,比如@html\u file
,或者文件的上下文是什么样的@result\u page
Ruby的类是一个非常简单的问题o使用、可扩展的解决方案。它下降到一个目录层次结构中,返回遇到的每个元素。您可以告诉它递归到特定目录中,忽略基于属性的文件和目录,而且速度非常快
这是文档中的示例:
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
需要“查找”
总尺寸=0
Find.Find(ENV[“HOME”])do | path|
if FileTest.directory?(路径)
如果File.basename(路径)[0]==?。
Find.prune#不要进一步查看此目录。
其他的
下一个
结束
其他的
总大小+=FileTest.size(路径)
结束
结束
我使用它对包含数千个文件的目录进行多次扫描。这与使用glob一样简单。由于递归调用没有基本情况,您可能会进入无限循环,如果没有与“html”匹配的文件,您需要使用递归吗?您不能执行类似于
Dir[“{proj_path}/***.html”的操作吗
这将再次为您提供所有具有html扩展功能的文件,答案比我想象的要简单得多。--对于第2部分,此实例变量在类中定义。实例变量的访问器将很好,这取决于您对方法的看法。如果是查询类型的方法,我希望它返回结果,如果是一个命令类型的方法,我希望它能改变类的状态,但不能同时改变两者。