You need to enable JavaScript to run this app.
导航
列举对象(C++ SDK)
最近更新时间:2024.02.04 18:30:56首次发布时间:2022.04.08 10:56:30

本文介绍如何通过 ListObject 列举指定桶下的所有对象、指定前缀文件、指定目录下的文件和子目录。

注意事项

  • ListObjects 接口已经修订为 ListObjectsType2,强烈建议开发者使用 ListObjectsType2。为保障向后兼容性,TOS 继续支持 ListObjects 接口。
  • 使用列举对象 V2,您必须具有 tos:ListBucket 权限,具体操作,请参见 IAM 策略概述

参数说明

参数

描述

prefix

本次查询结果的前缀。

delimiter

对对象名称进行分组的字符。

marker

列举对象的起始位置。设定从该值之后按字母排序返回对象列表。通常为上次请求返回的 nextMarker 值。

maxKeys

返回列举对象的最大数。默认为 1000。
取值:大于 0 小于等于 1000。

encodingType

对返回的内容进行编码并指定编码的类型。
默认值: None

示例代码

简单列举

以下代码用于列举桶 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 并且以斜线 / 结尾的对象, 模拟目录的功能。
通过 delimiterprefix 两个参数可以模拟目录的功能:

  1. 首先设置 delimiter/ 同时设置 prefix 为空, 可返回根目录下的对象和子目录信息。
  2. 再设置 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