2012-01-19 32 views
12

Nói rằng tôi có các thư mục và các tập tin sau đây trong một xô Amazon S3 (tập tin nằm trong đậm):Làm thế nào tôi có thể không đệ quy duyệt nội dung của một thư mục với API AWS S3?

  • bucketname/
  • bucketname/folder1/
  • bucketname/folder1/foobar.txt
  • bucketname/folder1/subfolder1/
  • bucketname/folder1/subfolder1/hello.txt
  • bucketname/folder1/subfolder2/
  • bucketname/folder1/subfolder2/world.txt
  • bucketname/folder1/subfolder2/subsubfolder1/
  • bucketname/folder1/subfolder2/subsubfolder1/file.txt

Làm cách nào tôi có thể liệt kê tất cả các đối tượng và ngay lập tức thư mục con của một thư mục cụ thể với .NET AWS S3 API, mà không đệ quy nhận mọi thứ bên dưới d irectory? Nói cách khác, làm thế nào tôi có thể "duyệt" nội dung của một thư mục ở một cấp độ?

Ví dụ: hãy tưởng tượng tôi muốn duyệt nội dung của bucketname/folder1/. Những gì tôi muốn thấy là như sau:

  • bucketname/folder1/foobar.txt
  • bucketname/folder1/subfolder1/
  • bucketname/folder1/subfolder2/

. ..và không có gì khác. Tôi không muốn liệt kê các tệp và thư mục trong các thư mục con , tôi chỉ muốn liệt kê các tệp và thư mục con ở cấp độ folder1.

Có cách nào để áp dụng bộ lọc cho một cuộc gọi API AWS duy nhất để nó không trả lại mọi thứ và buộc tôi phân tích cú pháp chỉ những gì tôi cần theo cách thủ công không?

tôi đã tìm thấy rằng mã này hãy cho tôi nhận được chỉ là thư mục con ngay lập tức (như dự định), nhưng tôi không thể tìm ra cách để bao gồm ngay file quá:

var request = new ListObjectsRequest() 
    .WithBucketName("bucketname") 
    .WithPrefix(@"folder1/") 
    .WithDelimiter(@"/"); 

using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey)) 
using (var response = client.ListObjects(request)) 
{ 
    foreach (var item in response.CommonPrefixes) 
    { 
     /* ... */ 
    } 
} 

Trả lời

22

tôi đã có ngược lại vấn đề (tôi biết làm thế nào để có được các tập tin trong thư mục được chỉ định, nhưng không phải là thư mục con).

Câu trả lời là Amazon liệt kê các tệp khác với các thư mục con.

Các thư mục con được liệt kê, như ví dụ của bạn hiển thị, trong bộ sưu tập ListObjectsResponse.CommonPrefixes.

Tệp được liệt kê trong bộ sưu tập ListObjectsResponse.S3Objects.

Vì vậy, mã của bạn sẽ trông như thế này:

var request = new ListObjectsRequest() 
.WithBucketName("bucketname") 
.WithPrefix(@"folder1/") 
.WithDelimiter(@"/"); 

using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey)) 
using (var response = client.ListObjects(request)) 
{ 
    foreach (var subFolder in response.CommonPrefixes) 
    { 
     /* list the sub-folders */ 
    } 
    foreach (var file in response.S3Objects) { 
     /* list the files */ 
    } 
} 

tìm kiếm google của tôi bật lên bài này trên blog burningmonk với điều này trong phần bình luận:

Khi bạn thực hiện theo yêu cầu ListObjects, để liệt kê các thư mục cấp cao nhất, không đặt tiền tố nhưng đặt dấu phân cách thành '/', sau đó kiểm tra thuộc tính 'CommonPrefixes' trên thư trả lời cho các thư mục nằm trong thư mục trên cùng.

Để liệt kê nội dung của 'thư mục gốc', hãy đặt yêu cầu bằng tiền tố được đặt thành tên của thư mục cộng với dấu gạch chéo ngược, ví dụ: ‘Rootfolder /’ và đặt dấu phân tách thành ‘/’. Trong phản hồi, bạn sẽ luôn có chính thư mục làm phần tử có cùng khóa với tiền tố bạn đã sử dụng trong yêu cầu, cộng với mọi thư mục con trong thuộc tính ‘CommonPrefixes’.

Các vấn đề liên quan