版本控制可以防止文件被意外覆盖或删除。本文介绍如何使用 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;
}
相关文档
-
关于设置版本控制的完整示例代码,请参见PutBucketVersioning.cpp。
-
关于获取版本控制状态的完整示例代码,请参见GetBucketVersioning.cpp。
-
关于单次列举文件版本的完整示例代码,请参见ListObjectVersions.cpp。
-
关于通过 Paginator 列举所有文件版本的完整示例代码,请参见ListObjectVersionsPaginator.cpp。
该文章对您有帮助吗?