2012-03-29 118 views

回答

53

如前所述,Amazon S3確實需要Listing Keys Using the AWS SDK for .NET

如水桶可以包含按鍵幾乎無限數量,清單查詢的 完整的結果可能會非常大。要管理大型結果集,Amazon S3會使用分頁將它們拆分爲多個響應,即 。每個列表鍵響應都會返回一個高達 1,000個鍵的頁面,並帶有一個指示符,指示響應是否被截斷。 您發送一系列列表密鑰請求,直到您收到所有密鑰 。

所提到的指標是從ObjectsResponse ClassNextMarker屬性 - 它的使用在完整的示例Listing Keys Using the AWS SDK for .NET所示,與相關的片段的存在:

static AmazonS3 client; 
client = Amazon.AWSClientFactory.CreateAmazonS3Client(
        accessKeyID, secretAccessKeyID); 

ListObjectsRequest request = new ListObjectsRequest(); 
request.BucketName = bucketName; 
do 
{ 
    ListObjectsResponse response = client.ListObjects(request); 

    // Process response. 
    // ... 

    // If response is truncated, set the marker to get the next 
    // set of keys. 
    if (response.IsTruncated) 
    { 
     request.Marker = response.NextMarker; 
    } 
    else 
    { 
     request = null; 
    } 
} while (request != null); 
+0

2年以上後,目前仍是完美的解決方案!謝謝:) – hardba11 2014-04-24 18:55:12

+0

完美答案... – 2014-06-09 18:54:12

+2

您的第二個鏈接現在已被破解(迭代通過多頁結果),並可在此處找到:http://docs.aws.amazon.com/AmazonS3/latest/dev/ ListingObjectKeysUsingNetSDK.html – adamdport 2014-09-03 15:15:21

0

根據文檔的客戶端使用分頁的你描述的情況。根據文件,您應該使用IsTruncated的結果...如果它是true再次調用ListObjects並正確設置Marker以獲得下一頁等 - 停止呼叫時IsTruncated返回false

3

注意,上面的答案是不使用推薦的API列表對象:http://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html

下面的片段展示了它的外觀與新的API:

using (var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) 
{ 
    ListObjectsV2Request request = new ListObjectsV2Request 
    { 
      BucketName = bucketName, 
      MaxKeys = 10 
    }; 
    ListObjectsV2Response response; 
    do 
    { 
     response = await s3Client.ListObjectsV2Async(request); 

     // Process response. 
     // ... 

     request.ContinuationToken = response.NextContinuationToken; 

    } while (response.IsTruncated == true);   
}