You need to enable JavaScript to run this app.
导航

列举对象 V2(C++ SDK)

最近更新时间2024.02.04 18:31:04

首次发布时间2023.01.29 15:35:46

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

注意事项

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

参数说明

listObjectsType2 支持的参数如下。

参数

描述

prefix

本次查询结果的前缀。

delimiter

对对象名进行分组的字符。通常使用 / 作为分组字符。

startAfter

此次列举对象的起点。

continuationToken

指定列举操作需要从此 token 开始。可从上次列举结果中的 nextContinuationToken中 获取。

maxKeys

返回对象的最大数量。最大值为 1000,即一次请求最多返回 1000 个对象。

encodingType

指定对返回的内容进行编码的编码类型,取值说明如下:
url:进行url编码。

示例代码

简单列举

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

    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;
}