diff --git a/lib/s3/bucket.rb b/lib/s3/bucket.rb
index f8ea8c1..8df1a59 100644
--- a/lib/s3/bucket.rb
+++ b/lib/s3/bucket.rb
@@ -124,6 +124,15 @@ def object(key)
Object.send(:new, self, :key => key)
end
+ # Returns the root directories in the bucket and caches the result
+ #
+ # ==== Parameters
+ # * params - additional params for list_directories
+ # request.
+ def directories(params = {})
+ Proxy.new(lambda { list_directories(params) }, :owner => self)
+ end
+
def inspect #:nodoc:
"#<#{self.class}:#{name}>"
end
@@ -167,6 +176,11 @@ def list_bucket(params = {})
objects_attributes.map { |object_attributes| Object.send(:new, self, object_attributes) }
end
+ def list_directories(params = {})
+ response = bucket_request(:get, :params => params.merge(:delimiter => "/"))
+ parse_list_directories_result(response.body)
+ end
+
def bucket_headers(options = {})
bucket_request(:head, :params => options)
rescue Error::ResponseError => e
diff --git a/lib/s3/parser.rb b/lib/s3/parser.rb
index f0c6f86..f023af3 100644
--- a/lib/s3/parser.rb
+++ b/lib/s3/parser.rb
@@ -30,6 +30,14 @@ def parse_list_bucket_result(xml)
objects_attributes
end
+ def parse_list_directories_result(xml)
+ names = []
+ rexml_document(xml).elements.each("ListBucketResult/CommonPrefixes/Prefix") do |e|
+ names << e.text
+ end
+ names
+ end
+
def parse_copy_object_result(xml)
object_attributes = {}
document = rexml_document(xml)