本文介绍如何通过 ListObject 列举指定桶下的所有对象、指定前缀文件、指定目录下的文件和子目录。
tos:ListBucket
权限,具体操作,请参见 IAM 策略概述。参数 | 描述 |
---|---|
prefix | 本次查询结果的前缀。 |
delimiter | 对对象名称进行分组的字符。 |
marker | 列举对象的起始位置。设定从该值之后按字母排序返回对象列表。通常为上次请求返回的 nextMarker 值。 |
maxKeys | 返回列举对象的最大数。默认为 1000。 |
encodingType | 对返回的内容进行编码并指定编码的类型。 |
以下代码用于列举桶 examplebucket
中最多 10 个对象。
#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); ListObjectsV2Input input(bucketName); input.setMaxKeys(10); auto output = client.listObjects(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
中最多 200 个对象。通过 maxKeys
设置一次请求返回对象的最大数量,通过指定 marker
为第一次列举返回的 nextMarker
,实现继续列举对象。
#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); ListObjectsV2Input input(bucketName); input.setMaxKeys(100); auto output = client.listObjects(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; } if(output.result().isTruncated()){ input.setMarker(output.result().getNextMarker()); auto output1 = client.listObjects(input); if (!output1.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.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); ListObjectsV2Input input(bucketName); input.setPrefix(prefix); bool isTruncated = true; std::string nextMarker = ""; while(isTruncated){ input.setMarker(nextMarker); auto output = client.listObjects(input); if (!output.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } nextMarker = output.result().getNextMarker(); 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"; // 填写列举的文件前缀(Prefix)。 std::string prefix = "yourkeyPrefix"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); ListObjectsV2Input input(bucketName); input.setMaxKeys(100); bool isTruncated = true; std::string nextMarker = ""; while(isTruncated){ input.setMarker(nextMarker); auto output = client.listObjects(input); if (!output.isSuccess()) { // 异常处理 std::cout << "ListObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } nextMarker = output.result().getNextMarker(); 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); ListObjectsV2Input input(bucketName); input.setDelimiter("/"); input.setMaxKeys(10); auto output = client.listObjects(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; }
关于列举对象的 API 文档,请参见 ListObjects。