【发布时间】:2012-04-12 19:55:08
【问题描述】:
S3Client.ListObjects 仅返回 1000 个对象。如何使用 Amazon C# 库检索所有现有对象的列表?
【问题讨论】:
标签: c# amazon-s3 amazon-web-services
S3Client.ListObjects 仅返回 1000 个对象。如何使用 Amazon C# 库检索所有现有对象的列表?
【问题讨论】:
标签: c# amazon-s3 amazon-web-services
如前所述,Amazon S3 确实需要Listing Keys Using the AWS SDK for .NET:
由于存储桶可以包含几乎无限数量的键,因此 列表查询的完整结果可能非常大。管理 大型结果集,Amazon S3 使用分页将它们拆分为 多重回应。每个列表键响应返回最多一页 1,000 个键,带有指示响应是否被截断的指示器。 您发送一系列列表键请求,直到您收到所有 钥匙。
提到的指标是来自ObjectsResponse Class 的NextMarker 属性 - 它的用法在完整示例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);
【讨论】:
根据文档,客户在您描述的情况下使用分页。根据文档,您应该在结果上使用IsTruncated...如果是true,则再次调用ListObjects,并正确设置Marker以获取下一页等-当IsTruncated返回false时停止调用.
【讨论】:
请注意,上面的答案没有使用推荐的 API 来列出对象:http://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html
以下 sn-p 显示了使用新 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);
}
【讨论】:
API 版本已更改;所以需要做如下:
ListObjectsV2Request request = new ListObjectsV2Request
{
BucketName = bucketName,
MaxKeys = 10
};
ListObjectsV2Response response;
do
{
response = await client.ListObjectsV2Async(request);
// Process the response.
foreach (S3Object entry in response.S3Objects)
{
Console.WriteLine("key = {0} size = {1}",
entry.Key, entry.Size);
}
Console.WriteLine("Next Continuation Token: {0}", response.NextContinuationToken);
request.ContinuationToken = response.NextContinuationToken;
} while (response.IsTruncated);
详情请见https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingNetSDK.html
【讨论】:
使用分页器,介绍了here。与 do-while 相比,Amazon 推荐这些语法更简洁,并且它们利用了 C# 8 的 IAsyncEnumerable。
IAmazonS3 S3;
CancellationToken cancellationToken;
var results = new List<S3Object>();
var paginator = S3.Paginators.ListObjectsV2(new ListObjectsV2Request
{
BucketName = "my-bucket-name",
Prefix = "my/prefix",
});
await foreach (var response in paginator.Responses.WithCancellation(cancellationToken))
{
results.AddRange(response.S3Objects);
}
return results;
【讨论】: