2012-03-08 55 views
0

我在我的REST API wrapeer中有两个类:Wrapper::FolderWrapper::File。每个文件夹可以包含多个文件夹和文件。文件夹的内容可以通过.list.类的方法进行修改。递归找到所有文件的最佳方式(REST API)

我想实现.all类的方法Wrapper::File这将返回所有文件夹中的所有文件的数组。

下面的方法不起作用,但显示像我想要的东西。

class Wrapper::File 
    def self.all 
    folders = Wrapper::Folder.list('/') 
    files = [] 
    while folders.size > 0 
     folders.each do |object| 
     if object.is_a?(Wrapper::Folder) 
      folders = Wrapper::Folder.list('/') 
     else 
      files << object 
     end 
     end 
    end 
    end 
end 

回答

0

未经测试,但这将是递归解决方案的基本要点。将返回一个文件名(包括路径)和没有目录的数组。

def getFilesRecursive(path) 

    # create our directory object and file list storage 
    d = Dir.new(path) 
    l = Array.new 

    # iterate over our given directory 
    d.each do |f| 

    # exclude . and .. 
    if !(f =~ /$[\.]{1,2}^/) 

     # recurse on a directory 
     if File.directory?(f) 
     l += getFilesRecursive(path + f) 

     # store on a file 
     else 
     l.push(path + f) 
     end 

    end # if not . or .. 

    end # Dir.each 

    # return our list of files 
    return l 

end # getFlesRecursive() 

# let's get some files! 
files = getFilesRecursive("/") 
+0

它通过'Dir'和'File'操作目录和文件,而我无法做到这一点。它是REST API的封装器,文件与只有类名的目录不同。 – p0deje 2012-03-08 15:12:16

+0

解决方案基本相同 - _self.all_需要接受_path_参数,第一个列表调用应该是_folders = Wrapper :: Folder.list(path)_。删除outer_while folders.size> 0_而不是_Dir.each_,使用_folders.each_(或甚至_Wrapper :: Folder.list(path).each_)。目录测试需要像_files + = self.all(object)_这样的东西来递归到目录结构中,而不是重复相同的列表调用。其他条件看起来不错。在你的迭代器之后,你需要返回你的文件数组(它将被递归地推回到_files + = self.all(object)_ array。 – vengeance 2012-03-08 15:41:46

+0

实际上,而不是路径,它看起来像你可以传入一个Wrapper: :文件夹对象并从那里获取您的列表。 – vengeance 2012-03-08 15:45:35

相关问题