次のコードを使用して、S3バケット内のすべてのキーを一覧表示します。
バケットには約15,000個のオブジェクトがあります。ただし、このコードは最初の1000個のオブジェクトを無限にループします。SetMarker()メソッドを尊重していないようです。
これを修正する方法に関するヒントはありますか?
#include <aws/s3/S3Client.h>
#include <aws/s3/model/ListObjectsRequest.h>
#include <aws/s3/model/Object.h>
int main(int argc, const char* argv[])
{
Aws::SDKOptions options;
Aws::InitAPI(options);
{
Aws::Client::ClientConfiguration config;
config.region="ap-northeast-1";
Aws::S3::S3Client s3_client(config);
Aws::S3::Model::ListObjectsRequest objects_request;
objects_request.WithBucket("MYBUCKETNAME").WithPrefix("some-prefox");
bool isDone = false;
bool isFailed= false;
Aws::S3::Model::ListObjectsOutcome outcome;
int c=0;
while(!isDone) {
outcome=s3_client.ListObjects(objects_request);
if(!outcome.IsSuccess()) break;
//process
Aws::Vector<Aws::S3::Model::Object> object_list = outcome.GetResult().GetContents();
for (auto const &s3_object : object_list)
{
std::cout << "* " << s3_object.GetKey() << std::endl;
c++;
}
std::cout<<"--------- Break"<<c<<"\n";
isDone=!outcome.GetResult().GetIsTruncated();
if(!isDone) {
objects_request.SetMarker(outcome.GetResult().GetNextMarker());
}
}
std::cout << "Count "<<c<<"\n";
//check isFailed
if(!outcome.IsSuccess()) {
std::cout << "ListObjects error: " <<
outcome.GetError().GetExceptionName() << " " <<
outcome.GetError().GetMessage() << std::endl;
}
}
Aws::ShutdownAPI(options);
}
NextMarkerのドキュメントによると:
注意
この要素は、区切り文字要求パラメーターを指定した場合にのみ返されます。応答にNextMarkerが含まれておらず、切り捨てられている場合は、応答の最後のキーの値を後続の要求のマーカーとして使用して、次のオブジェクトキーのセットを取得できます。
したがって、コードは次のようになります。
if(!isDone) {
objects_request.SetMarker(outcome.GetResult().GetContents().back().GetKey());
}
また、V1 ListObjectsメソッドは非推奨であることに注意してください。これは、少し使いやすい明示的な継続トークンを使用するListObjectsV2を使用する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加