本文介绍如何通过 listObjectsType2 列举指定桶下的所有对象、指定前缀文件、指定目录下的文件和子目录。
tos:ListBucket
权限,具体操作,请参见 IAM 策略概述。listObjectsType2 支持的参数如下。
参数 | 描述 |
---|---|
prefix | 本次查询结果的前缀。 |
delimiter | 对对象名进行分组的字符。通常使用 |
startAfter | 此次列举对象的起点。 |
continuationToken | 指定列举操作需要从此 token 开始。可从上次列举结果中的 nextContinuationToken中 获取。 |
maxKeys | 返回对象的最大数量。最大值为 1000,即一次请求最多返回 1000 个对象。 |
encodingType | 指定对返回的内容进行编码的编码类型,取值说明如下: |
以下代码用于列举桶 examplebucket
中最多 100 个对象。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); ListObjectsType2Input input(bucketName); input.setMaxKeys(100); auto output = client.listObjectsType2(input); if (!output.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "ListObjects success." << std::endl; for (const auto& object : output.result().getContents()) { std::cout << "object"<< ",name:" << object.getKey() << ",size:" << object.getSize() << ",lastmodify time:" << object.getStringFormatLastModified() << ",storage class:" << object.getStringFormatStorageClass() << std:: endl; } // 释放网络等资源 CloseClient(); return 0; }
以下代码用于分页列举桶 examplebucket
中的对象。通过 maxKeys
设置一次请求返回对象的最大数量,示例代码中列举桶 examplebucket
中 100 个对象,并通过指定 continuationToken
为第一次列举返回的 nextContinuationToken
,实现继续列举对象。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); ListObjectsType2Input input(bucketName); input.setMaxKeys(100); auto output = client.listObjectsType2(input); if (!output.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "ListObjects success." << std::endl; for (const auto& object : output.result().getContents()) { std::cout << "object"<< ",name:" << object.getKey() << ",size:" << object.getSize() << ",lastmodify time:" << object.getStringFormatLastModified() << ",storage class:" << object.getStringFormatStorageClass() << std::endl; } // 使用 continuationToken 列举对象 if (output.result().isTruncated()){ input.setContinuationToken(output.result().getNextContinuationToken()); auto output1 = client.listObjectsType2(input); if (!output1.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output1.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "ListObjects success." << std::endl; for (const auto& object : output1.result().getContents()) { std::cout << "object"<< ",name:" << object.getKey() << ",size:" << object.getSize() << ",lastmodify time:" << object.getStringFormatLastModified() << ",storage class:" << object.getStringFormatStorageClass() << std::endl; } } // 释放网络等资源 CloseClient(); return 0; }
以下代码用于列举桶 examplebucket
中指定前缀的的所有对象。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写列举的文件前缀(Prefix)。 std::string prefix = "yourkeyPrefix"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); ListObjectsType2Input input(bucketName); input.setPrefix(prefix); bool isTruncated = true; std::string nextContinuationToken = ""; while(isTruncated){ input.setContinuationToken(nextContinuationToken); auto output = client.listObjectsType2(input); if (!output.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } nextContinuationToken = output.result().getNextContinuationToken(); isTruncated = output.result().isTruncated(); std::cout << "ListObjects success." << std::endl; for (const auto& object : output.result().getContents()) { std::cout << "object"<< ",name:" << object.getKey() << ",size:" << object.getSize() << ",lastmodify time:" << object.getStringFormatLastModified() << ",storage class:" << object.getStringFormatStorageClass() << std::endl; } } // 释放网络等资源 CloseClient(); return 0; }
以下代码用于列举桶 examplebucket
中的所有对象。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); ListObjectsType2Input input(bucketName); bool isTruncated = true; std::string nextContinuationToken = ""; while(isTruncated){ input.setContinuationToken(nextContinuationToken); auto output = client.listObjectsType2(input); if (!output.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } nextContinuationToken = output.result().getNextContinuationToken(); isTruncated = output.result().isTruncated(); std::cout << "ListObjects success." << std::endl; for (const auto& object : output.result().getContents()) { std::cout << "object"<< ",name:" << object.getKey() << ",size:" << object.getSize() << ",lastmodify time:" << object.getStringFormatLastModified() << ",storage class:" << object.getStringFormatStorageClass() << std::endl; } } // 释放网络等资源 CloseClient(); return 0; }
TOS 只有对象的概念, 可通过创建一个大小为 0 并且以斜线 /
结尾的对象, 模拟目录的功能。
通过 delimiter
和 prefix
两个参数可以模拟目录的功能:
delimiter
为 /
同时设置 prefix
为空, 可返回根目录下的对象和子目录信息。delimiter
为 /
同时设置 prefix
为子目录(subfiledir
), 可返回子目录的对象和次级目录。以下代码用于列举根目录下的对象和子目录。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); ListObjectsType2Input input(bucketName); input.setDelimiter("/"); input.setMaxKeys(1000); auto output = client.listObjectsType2(input); if (!output.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "ListObjects success." << std::endl; for (const auto& object : output.result().getContents()) { std::cout << "object"<< ",name:" << object.getKey() << ",size:" << object.getSize() << ",lastmodify time:" << object.getStringFormatLastModified() << ",storage class:" << object.getStringFormatStorageClass() << std:: endl; } for (const auto& prefix : output.result().getCommonPrefixes()) { std::cout << "Sub Dir: "<< prefix.getPrefix() << std:: endl; } // 释放网络等资源 CloseClient(); return 0; }