Rails中的递归目录搜索

时间:2014-01-27 20:31:18

标签: ruby-on-rails ruby recursion

所以我在这里有一个函数,应该将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 - 我的递归方法可以更好吗?我意识到这是非常开放的,所以无论如何,要把愤怒的居民熄灭。我很乐意接受你的严厉批评,并全心全意地感谢你的好建议:)

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一样快。