2012-03-08 39 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