2012-03-08 11 views
0

私はREST API wrapeerに2つのクラスを持っています:Wrapper::FolderWrapper::Fileです。各フォルダーには、多数のフォルダーとファイルを含めることができます。フォルダの内容は.list.クラスメソッドで取得できます。すべてのファイルを再帰的に見つける最良の方法(REST API)

Wrapper::File.allクラスメソッドを実装して、すべてのフォルダのすべてのファイルの配列を返したいとします。

次のメソッドは機能しませんが、私が欲しいものを示しています。

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

+0

解決方法は基本的に同じです - _self.all_は_path_パラメータを受け入れる必要があり、最初のリスト呼び出しは_folders = Wrapper :: Folder.list(path)_でなければなりません。外側の_while folders.size> 0_を削除し、_Dir.each_の代わりに_folders.each_(または_Wrapper :: Folder.list(path).each_)を使用します。ディレクトリテストでは、同じリスト呼び出しを繰り返すのではなく、ディレクトリ構造を再帰的に処理するために_files + = self.all(object)_のようなものが必要です。それ以外の場合はOKです。あなたのイテレータの後で、ファイル配列を返す必要があります(再帰的に_files + = self.all(object)_ arrayにプッシュバックされます)。 – vengeance

+0

実際にはパスの代わりに、ラッパーを渡すことができます。 :フォルダオブジェクトとそこからあなたのリストを取得します。 – vengeance

関連する問題