版本控制(C++ SDK V2)

更新时间:
复制为 MD 格式

版本控制可以防止文件被意外覆盖或删除。本文介绍如何使用 OSS C++ SDK V2 设置和获取存储空间的版本控制状态,以及列举文件版本。

注意事项

  • 运行示例代码前,请将代码中的 <region> 替换为实际的地域,如 cn-hangzhou

  • 本文示例代码使用环境变量获取访问凭证。

  • 设置版本控制需要拥有 oss:PutBucketVersioning 权限。

  • 获取版本控制状态需要拥有 oss:GetBucketVersioning 权限。

示例代码

设置版本控制

以下代码演示如何为存储空间开启版本控制:

#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"

namespace oss = alibabacloud::oss2;

int main() {
    auto conf = oss::ClientConfiguration::loadDefault();
    conf.region = "<region>";
    conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();

    oss::OSSClient client(conf);

    auto outcome = client.putBucketVersioning(
        oss::models::PutBucketVersioningRequest()
            .setBucket("examplebucket")
            .setVersioningConfiguration(
                oss::models::VersioningConfiguration()
                    .setStatus("Enabled")));

    if (!outcome.has_value()) {
        auto& e = outcome.error();
        std::cerr << "设置版本控制失败"
                  << ", code: " << e.getCode()
                  << ", message: " << e.getMessage()
                  << ", requestId: " << e.getRequestId() << std::endl;
        return 1;
    }

    auto& result = outcome.value();
    std::cout << "设置版本控制成功"
              << ", status: " << result.getStatusCode() << std::endl;
    return 0;
}
          

获取版本控制状态

以下代码演示如何获取存储空间的版本控制状态:

#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"

namespace oss = alibabacloud::oss2;

int main() {
    auto conf = oss::ClientConfiguration::loadDefault();
    conf.region = "<region>";
    conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();

    oss::OSSClient client(conf);

    auto outcome = client.getBucketVersioning(
        oss::models::GetBucketVersioningRequest()
            .setBucket("examplebucket"));

    if (!outcome.has_value()) {
        auto& e = outcome.error();
        std::cerr << "获取版本控制状态失败"
                  << ", code: " << e.getCode()
                  << ", message: " << e.getMessage()
                  << ", requestId: " << e.getRequestId() << std::endl;
        return 1;
    }

    auto& result = outcome.value();
    std::cout << "获取版本控制状态成功"
              << ", status: " << result.getStatusCode() << std::endl;
    if (result.hasVersioningConfiguration()) {
        auto& vc = result.getVersioningConfiguration();
        std::cout << "版本控制状态: " << vc.status.value_or("未设置") << std::endl;
    }
    return 0;
}
          

单次列举文件版本

以下代码演示如何调用一次 listObjectVersions 列举文件版本信息。单次调用最多返回 maxKeys 个(默认 100,最大 1000),如需获取存储空间中全部文件版本,请使用下文的 Paginator 模式。

#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"

namespace oss = alibabacloud::oss2;

int main() {
    auto conf = oss::ClientConfiguration::loadDefault();
    conf.region = "<region>";
    conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();

    oss::OSSClient client(conf);

    auto outcome = client.listObjectVersions(
        oss::models::ListObjectVersionsRequest()
            .setBucket("examplebucket")
            .setMaxKeys(100));

    if (!outcome.has_value()) {
        auto& e = outcome.error();
        std::cerr << "列举文件版本失败"
                  << ", code: " << e.getCode()
                  << ", message: " << e.getMessage()
                  << ", requestId: " << e.getRequestId() << std::endl;
        return 1;
    }

    auto& result = outcome.value();
    std::cout << "列举文件版本成功, status: " << result.getStatusCode() << std::endl;

    std::cout << "文件版本:" << std::endl;
    for (const auto& ver : result.getVersions()) {
        std::cout << "  文件名: " << ver.key
                  << ", versionId: " << ver.versionId
                  << ", isLatest: " << ver.isLatest.value_or(false)
                  << ", lastModified: " << ver.lastModified
                  << ", size: " << ver.size << std::endl;
    }

    std::cout << "删除标记:" << std::endl;
    for (const auto& dm : result.getDeleteMarkers()) {
        std::cout << "  文件名: " << dm.key
                  << ", versionId: " << dm.versionId
                  << ", isLatest: " << dm.isLatest.value_or(false) << std::endl;
    }
    return 0;
}
          

通过 Paginator 列举所有文件版本

使用分页器(Paginator)可以自动翻页,遍历存储空间中全部文件版本与删除标记,无需手动处理 KeyMarker/VersionIdMarker:

#include <iostream>
#include "alibabacloud/oss2/ClientConfiguration.h"
#include "alibabacloud/oss2/OSSClient.h"
#include "alibabacloud/oss2/Paginator.h"
#include "alibabacloud/oss2/credentials/CredentialsProvider.h"

namespace oss = alibabacloud::oss2;

int main() {
    auto conf = oss::ClientConfiguration::loadDefault();
    conf.region = "<region>";
    conf.credentialsProvider = std::make_shared<oss::EnvironmentVariableCredentialsProvider>();

    oss::OSSClient client(conf);

    auto paginator = oss::makePaginator(client,
        oss::models::ListObjectVersionsRequest()
            .setBucket("examplebucket")
            .setMaxKeys(100));

    int pageNum = 0;
    int totalVersions = 0;
    int totalDeleteMarkers = 0;
    while (paginator.hasNext()) {
        auto outcome = paginator.nextPage();
        if (!outcome.has_value()) {
            auto& e = outcome.error();
            std::cerr << "列举文件版本失败"
                      << ", code: " << e.getCode()
                      << ", message: " << e.getMessage()
                      << ", requestId: " << e.getRequestId() << std::endl;
            return 1;
        }
        auto& result = outcome.value();
        pageNum++;
        std::cout << "第 " << pageNum << " 页, isTruncated: " << result.getIsTruncated() << std::endl;
        for (const auto& ver : result.getVersions()) {
            std::cout << "  Version: " << ver.key
                      << ", versionId: " << ver.versionId
                      << ", isLatest: " << ver.isLatest.value_or(false) << std::endl;
            totalVersions++;
        }
        for (const auto& dm : result.getDeleteMarkers()) {
            std::cout << "  DeleteMarker: " << dm.key
                      << ", versionId: " << dm.versionId
                      << ", isLatest: " << dm.isLatest.value_or(false) << std::endl;
            totalDeleteMarkers++;
        }
    }
    std::cout << "共 " << totalVersions << " 个版本, " << totalDeleteMarkers << " 个删除标记, " << pageNum << " 页" << std::endl;
    return 0;
}
          

相关文档