2014-01-27 156 views
0

所以我这里有一个功能,应该采取的路径到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

你可以进入一个无限循环作为你的递归调用没有基础的情况下,如果没有什么文件匹配“HTML” – bjhaid

+0

你需要使用递归?你就不能像'DIR [“#{} proj_path/**/*。HTML”]'会给你所有具有HTML扩展 –

回答

1

如果您不需要使用递归,你可以只是做

Dir["#{proj_path}"/**/*.html"]这应该给你所有具有html的文件列表延期。

至于你的问题:您使用的@found_it取决于事物的更大的范围。这个函数在哪里定义了一个类或一个模块?变量本身可能更有意义的像@html_file也许名称的文件的背景是像@result_page什么。

+0

文件再次答案是比我想象的要简单得多。 - 对于部分2这个实例变量在类 – James

+0

定义的实例变量的访问将取决于你如何看待你的方法好。如果它是一个查询类型的方法,我希望它返回结果,如果它是一个命令类型的方法,我希望它改变了类的状态,但不是两者。 –

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