このトピックでは、指定されたバケット内のすべてのオブジェクトをリストする方法、指定された数のオブジェクトをリストする方法、および指定されたフォルダー内のオブジェクトの合計サイズをリストする方法について説明します。
背景情報
Object Storage Service (OSS) オブジェクトはアルファベット順にソートされます。`OssClient.ListObjects` を使用して、バケット内のオブジェクトをリストできます。`ListObjects` には、次の 3 つのパラメーターフォーマットがあります:
ListObjectOutcome ListObjects(const std::string& bucket) const:バケット内のオブジェクトをリストします。1 回のリクエストで最大 1,000 個のオブジェクトを返すことができます。
ListObjectOutcome ListObjects(const std::string& bucket, const std::string& prefix) const:バケット内で指定されたプレフィックスを持つオブジェクトをリストします。1 回のリクエストで最大 1,000 個のオブジェクトを返すことができます。
ListObjectOutcome ListObjects(const ListObjectsRequest& request) const:柔軟なクエリのために複数のフィルター機能を提供します。
次の表に、主なパラメーターを示します。
パラメーター | 説明 |
delimiter | オブジェクト名をグループ化するために使用される文字。名前に指定されたプレフィックスを含み、プレフィックスとデリミタの最初の出現箇所の間に現れるすべてのオブジェクトは、1 つのセット (commonPrefixes) としてグループ化されます。 |
prefix | 返されるオブジェクトが指定されたプレフィックスを持つ必要があることを指定します。 |
maxKeys | このリクエストで返されるオブジェクトの最大数。デフォルト値は 100 です。最大値は 1,000 です。 |
marker | 指定されたマーカーの後に現れるオブジェクトをリストします。 |
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient を作成する場合は、「OssClient インスタンスの作成」をご参照ください。
オブジェクトをリストするには、
oss:ListObjects権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
オブジェクトのリスト
次のコードは、指定されたバケット内のオブジェクトをリストする方法の例を示しています。デフォルトでは、100 個のオブジェクトが返されます。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* オブジェクトをリストします。*/
ListObjectsRequest request(BucketName);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
else {
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object"<<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std:: endl;
}
}
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}指定した数のオブジェクトのリスト
次のコードは、指定した数のオブジェクトをリストする方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* オブジェクトをリストします。*/
ListObjectsRequest request(BucketName);
/* リストするオブジェクトの最大数を 200 に設定します。*/
request.setMaxKeys(200);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess( )) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
else {
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object"<<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std ::endl;
}
}
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}指定したフォルダー内のオブジェクトとサブフォルダーのリスト
次のコードは、指定したフォルダー内のオブジェクトとサブフォルダーをリストする方法の例を示しています:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* リストするオブジェクトのプレフィックスを指定します。*/
std::string keyPrefix = "yourkeyPrefix";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
std::string nextMarker = "";
bool isTruncated = false;
do {
/* オブジェクトをリストします。*/
ListObjectsRequest request(BucketName);
/* フォワードスラッシュ (/) をフォルダー区切り文字として設定します。*/
request.setDelimiter("/");
request.setPrefix(keyPrefix);
request.setMarker(nextMarker);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess ()) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
break;
}
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object"<<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std::endl;
}
for (const auto& commonPrefix : outcome.result().CommonPrefixes()) {
std::cout << "commonPrefix" << ",name:" << commonPrefix << std::endl;
}
nextMarker = outcome.result().NextMarker();
isTruncated = outcome.result().IsTruncated();
} while (isTruncated);
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}指定したフォルダー内のオブジェクトサイズのリスト
次のコードは、指定したフォルダー内のオブジェクトの合計サイズを取得する方法の例を示しています:
#include <iostream>
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
static int64_t calculateFolderLength(const OssClient &client, const std::string &bucketName, const std::string &folder)
{
std::string nextMarker = "";
bool isTruncated = false;
int64_t size = 0;
do {
/* オブジェクトをリストします。*/
ListObjectsRequest request(bucketName);
request.setPrefix(folder);
request.setMarker(nextMarker);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
break;
}
for (const auto& object : outcome.result().ObjectSummarys()) {
size += object.Size();
}
nextMarker = outcome.result().NextMarker();
isTruncated = outcome.result().IsTruncated();
} while (isTruncated);
return size;
}
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* リストするオブジェクトのプレフィックスを指定します。*/
std::string keyPrefix = "yourkeyPrefix";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
std::string nextMarker = "";
bool isTruncated = false;
do {
/* オブジェクトをリストします。*/
ListObjectsRequest request(BucketName);
/* フォワードスラッシュ (/) をフォルダー区切り文字として設定します。*/
request.setDelimiter("/");
request.setPrefix(keyPrefix);
request.setMarker(nextMarker);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
break;
}
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object" <<
",name:" << object.Key() <<
",size:" << object.Size() << std::endl;
}
for (const auto& commonPrefix : outcome.result().CommonPrefixes()) {
int64_t foldersize = calculateFolderLength(client, BucketName, commonPrefix);
std::cout << "folder" <<
",name:" << commonPrefix <<
",size:" << foldersize << std::endl;
}
nextMarker = outcome.result().NextMarker();
isTruncated = outcome.result().IsTruncated();
} while (isTruncated);
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}指定したプレフィックスを持つオブジェクトのリスト
次のコードは、指定したプレフィックスを持つオブジェクトをリストする方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* リストするオブジェクトのプレフィックスを指定します。*/
std::string keyPrefix = "yourkeyPrefix";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
std::string nextMarker = "";
bool isTruncated = false;
do {
/* オブジェクトをリストします。*/
ListObjectsRequest request(BucketName);
request.setPrefix(keyPrefix);
request.setMarker(nextMarker);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
break;
}
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object"<<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std::endl;
}
nextMarker = outcome.result().NextMarker();
isTruncated = outcome.result().IsTruncated();
} while (isTruncated);
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}指定したマーカー以降のオブジェクトのリスト
marker パラメーターはオブジェクト名を指定します。次のコードは、指定されたマーカーの後に現れるオブジェクトをリストする方法の例を示しています。
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* マーカーを設定します。*/
std::string YourMarker = "yourMarker";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
ListObjectOutcome outcome;
do {
/* オブジェクトをリストします。*/
ListObjectsRequest request(BucketName);
/* 指定されたマーカーの後に現れるオブジェクトをリストします。*/
request.setMarker(YourMarker);
outcome = client.ListObjects(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
break;
}
YourMarker = outcome.result().NextMarker();
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object"<<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std::endl;
}
} while (outcome.result().IsTruncated());
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}オブジェクト名のエンコーディングの指定
オブジェクト名に特殊文字が含まれている場合は、転送のためにオブジェクト名を URL エンコードする必要があります。OSS は URL エンコーディングのみをサポートしています。
一重引用符 (')
二重引用符 ("")
アンパサンド (&)
山括弧 (< >)
中国語
次のコードは、オブジェクト名のエンコーディングを指定する方法の例を示しています:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
std::string Region = "yourRegion";
/* バケット名を指定します。例:examplebucket */
std::string BucketName = "examplebucket";
/* ネットワークリソースを初期化します。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
std::string nextMarker = "";
bool isTruncated = false;
do {
/* オブジェクトをリストします。*/
ListObjectsRequest request(BucketName) ;
/* オブジェクト名のエンコーディングを指定します。*/
request.setEncodingType("url");
request.setMarker(nextMarker);
auto outcome = client.ListObjects(request);
if (!outcome.isSuccess() ) {
/* 例外を処理します。*/
std::cout << "ListObjects fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
break;
}
for (const auto& object : outcome.result().ObjectSummarys()) {
std::cout << "object"<<
",name:" << object.Key() <<
",size:" << object.Size() <<
",last modified time:" << object.LastModified() << std::endl;
}
nextMarker = outcome.result().NextMarker();
isTruncated = outcome.result().IsTruncated();
} while (isTruncated);
/* ネットワークリソースを解放します。*/
ShutdownSdk();
return 0;
}フォルダー機能
OSS にはフォルダーの概念がありません。すべての要素はオブジェクトとして保存されます。フォルダーの作成は、フォワードスラッシュ (/) で終わるゼロバイトのオブジェクトを作成することと同じです。このオブジェクトはアップロードおよびダウンロードできます。OSS コンソールでは、フォワードスラッシュ (/) で終わるオブジェクトがフォルダーとして表示されます。
デリミタとプレフィックスのパラメーターを使用して、ディレクトリ機能をシミュレートできます:
`prefix` パラメーターをフォルダー名に設定すると、名前がこのプレフィックスで始まるオブジェクトがリストされます。これにより、フォルダー内のすべてのオブジェクトとサブディレクトリが再帰的にリストされます。
`prefix` パラメーターを設定し、`delimiter` パラメーターをフォワードスラッシュ (/) に設定すると、フォルダーの最上位レベルにあるオブジェクトとサブディレクトリのみがリストされます。サブディレクトリは `CommonPrefixes` 要素で返され、それらのサブディレクトリ内のオブジェクトとフォルダーはリストされません。
バケットにオブジェクト oss.jpg、fun/test.jpg、fun/movie/001.avi、および fun/movie/007.avi が含まれており、フォルダー区切り文字がフォワードスラッシュ (/) であると仮定します。次の例は、ディレクトリをシミュレートしてオブジェクトをリストする方法を示しています。
バケット内のすべてのオブジェクトのリスト
次のコードは、指定されたバケット内のすべてのオブジェクトをリストする方法の例を示しています。
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* OSS アカウント情報を初期化します。*/ /* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/ std::string Endpoint = "yourEndpoint"; /* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/ std::string Region = "yourRegion"; /* バケット名を指定します。例:examplebucket */ std::string BucketName = "examplebucket"; /* ネットワークリソースを初期化します。*/ InitializeSdk(); ClientConfiguration conf; conf.signatureVersion = SignatureVersionType::V4; /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/ auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>(); OssClient client(Endpoint, credentialsProvider, conf); client.SetRegion(Region); std::string nextMarker = ""; bool isTruncated = false; do { /* オブジェクトをリストします。*/ ListObjectsRequest request(BucketName); request.setMarker(nextMarker); auto outcome = client.ListObjects(request); if (!outcome.isSuccess()) { /* 例外を処理します。*/ std::cout << "ListObjects fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; ShutdownSdk(); return -1; } else { for (const auto& object : outcome.result().ObjectSummarys()) { std::cout << "object"<< ",name:" << object.Key() << ",size:" << object.Size() << ",last modified time:" << object.LastModified() << std::endl; } } nextMarker = outcome.result().NextMarker(); isTruncated = outcome.result().IsTruncated(); } while (isTruncated); /* ネットワークリソースを解放します。*/ ShutdownSdk(); return 0; }次の結果が返されます:
Objects: fun/movie/001.avi fun/movie/007.avi fun/test.jpg oss.jpg CommonPrefixes:指定したフォルダー内のすべてのオブジェクトのリスト
次のコードは、指定したフォルダー内のすべてのオブジェクトをリストする方法の例を示しています。
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* OSS アカウント情報を初期化します。*/ /* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/ std::string Endpoint = "yourEndpoint"; /* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/ std::string Region = "yourRegion"; /* バケット名を指定します。例:examplebucket */ std::string BucketName = "examplebucket"; /* ネットワークリソースを初期化します。*/ InitializeSdk(); ClientConfiguration conf; conf.signatureVersion = SignatureVersionType::V4; /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/ auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>(); OssClient client(Endpoint, credentialsProvider, conf); client.SetRegion(Region); std::string nextMarker = ""; bool isTruncated = false; do { /* オブジェクトをリストします。*/ ListObjectsRequest request(BucketName); request.setPrefix("fun/"); request.setMarker(nextMarker); auto outcome = client.ListObjects(request); if (!outcome.isSuccess()) { /* 例外を処理します。*/ std::cout << "ListObjects fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; break; } for (const auto& object : outcome.result().ObjectSummarys()) { std::cout << "object"<< ",name:" << object.Key() << ",size:" << object.Size() << ",last modified time:" << object.LastModified() << std::endl; } for (const auto& commonPrefix : outcome.result().CommonPrefixes()) { std::cout << "commonPrefix" << ",name:" << commonPrefix << std::endl; } nextMarker = outcome.result().NextMarker(); isTruncated = outcome.result().IsTruncated(); } while (isTruncated); /* ネットワークリソースを解放します。*/ ShutdownSdk(); return 0; }次の結果が返されます:
Objects: fun/movie/001.avi fun/movie/007.avi fun/test.jpg CommonPrefixes:フォルダー内のオブジェクトとサブフォルダーのリスト
次のコードは、指定したフォルダー内のオブジェクトとサブフォルダーをリストする方法の例を示しています。
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* OSS アカウント情報を初期化します。*/ /* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/ std::string Endpoint = "yourEndpoint"; /* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/ std::string Region = "yourRegion"; /* バケット名を指定します。例:examplebucket */ std::string BucketName = "examplebucket"; /* ネットワークリソースを初期化します。*/ InitializeSdk(); ClientConfiguration conf; conf.signatureVersion = SignatureVersionType::V4; /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/ auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>(); OssClient client(Endpoint, credentialsProvider, conf); client.SetRegion(Region); std::string nextMarker = ""; bool isTruncated = false; do { /* オブジェクトをリストします。*/ ListObjectsRequest request(BucketName); /* フォワードスラッシュ (/) をフォルダー区切り文字として設定します。*/ request.setDelimiter("/"); request.setPrefix("fun/"); request.setMarker(nextMarker); auto outcome = client.ListObjects(request); if (!outcome.isSuccess()) { /* 例外を処理します。*/ std::cout << "ListObjects fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; break; } for (const auto& object : outcome.result().ObjectSummarys()) { std::cout << "object"<< ",name:" << object.Key() << ",size:" << object.Size() << ",last modified time:" << object.LastModified() << std::endl; } for (const auto& commonPrefix : outcome.result().CommonPrefixes()) { std::cout << "commonPrefix" << ",name:" << commonPrefix << std::endl; } nextMarker = outcome.result().NextMarker(); isTruncated = outcome.result().IsTruncated(); } while (isTruncated); /* ネットワークリソースを解放します。*/ ShutdownSdk(); return 0; }次の結果が返されます:
Objects: fun/test.jpg CommonPrefixes: fun/movie/指定したフォルダー内のオブジェクトサイズのリスト
次のコードは、指定したフォルダー内のオブジェクトの合計サイズを取得する方法の例を示しています:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; static int64_t calculateFolderLength (const OssClient &client, const std::string &bucketName, const std::string &folder) { std::string nextMarker = ""; bool isTruncated = false; int64_t size = 0; do { /* オブジェクトをリストします。*/ ListObjectsRequest request(bucketName); request.setPrefix(folder); request.setMarker(nextMarker); auto outcome = client.ListObjects(request); if (!outcome.isSuccess()) { /* 例外を処理します。*/ std::cout << "ListObjects fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; break; } for (const auto& object : outcome.result().ObjectSummarys()) { size += object.Size(); } nextMarker = outcome.result().NextMarker(); isTruncated = outcome.result().IsTruncated(); } while (isTruncated); return size; } int main(void) { /* OSS アカウント情報を初期化します。*/ /* yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/ std::string Endpoint = "yourEndpoint"; /* yourRegion を、バケットが所在するリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/ std::string Region = "yourRegion"; /* バケット名を指定します。例:examplebucket */ std::string BucketName = "examplebucket"; /* ネットワークリソースを初期化します。*/ InitializeSdk(); ClientConfiguration conf; conf.signatureVersion = SignatureVersionType::V4; /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/ auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>(); OssClient client(Endpoint, credentialsProvider, conf); client.SetRegion(Region); std::string nextMarker = ""; bool isTruncated = false; do { /* オブジェクトをリストします。*/ ListObjectsRequest request(BucketName); /* フォワードスラッシュ (/) をフォルダー区切り文字として設定します。*/ request.setDelimiter("/"); request.setPrefix("fun/"); request.setMarker(nextMarker); auto outcome = client.ListObjects(request); if (!outcome.isSuccess()) { /* 例外を処理します。*/ std::cout << "ListObjects fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; break; } for (const auto& object : outcome.result().ObjectSummarys()) { std::cout << "object" << ",name:" << object.Key() << ",size:" << object.Size() << std::endl; } for (const auto& commonPrefix : outcome.result().CommonPrefixes()) { int64_t foldersize = calculateFolderLength(client, BucketName, commonPrefix); std::cout << "folder" << ",name:" << commonPrefix << ",size:" << foldersize << std::endl; } nextMarker = outcome.result().NextMarker(); isTruncated = outcome.result().IsTruncated(); } while (isTruncated); /* ネットワークリソースを解放します。*/ ShutdownSdk(); return 0; }
関連ドキュメント
オブジェクトをリストするために使用される完全なサンプルコードについては、GitHub の例をご参照ください。
オブジェクトをリストするために使用される API 操作の詳細については、「GetBucket (ListObjects)」および「ListObjectsV2 (GetBucketV2)」をご参照ください。