本文介绍删除对象的常用场景代码。
tos:DeleteObject 权限,具体操作请参见权限配置指南。tos:DeleteObjectVersion权限,具体操作请参见权限配置指南。
以下代码用于删除桶 examplebucket 中目录 exampledir/ 的所有数据。
#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);
std::string prefix = "exampledir/";
bool isTruncated = true;
std::string nextContinuationToken = "";
DeleteObjectInput deleteInput;
deleteInput.setBucket(bucketName);
while(isTruncated){
input.setContinuationToken(nextContinuationToken);
input.setPrefix(prefix);
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();
for (const auto& object : output.result().getContents()) {
deleteInput.setKey(object.getKey());
auto deleteOutput = client.deleteObject(deleteInput);
if (!deleteOutput.isSuccess()) {
if(deleteOutput.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){
std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
}
}
}
// 释放网络等资源
CloseClient();
return 0;
}
以下代码用于清空整个桶,包括删除所有对象、删除所有未合并的对象。
#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);
ListObjectVersionsV2Input input(bucketName);
bool isTruncated = true;
std::string nextKeyMarker = "";
DeleteObjectInput deleteObjectInput;
deleteObjectInput.setBucket(bucketName);
while(isTruncated){
input.setKeyMarker(nextKeyMarker);
auto output = client.listObjectVersions(input);
if (!output.isSuccess()) {
// 异常处理
std::cout << "ListObjects failed." << output.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
nextKeyMarker = output.result().getNextKeyMarker();
isTruncated = output.result().isTruncated();
for (const auto& versions : output.result().getVersions()) {
deleteObjectInput.setKey(versions.getKey());
auto deleteOutput = client.deleteObject(deleteObjectInput);
if (!deleteOutput.isSuccess()){
if(deleteOutput.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){
std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
}
}
for (const auto& deleteMarker : output.result().getDeleteMarkers()) {
deleteObjectInput.setKey(deleteMarker.getKey());
auto deleteOutput = client.deleteObject(deleteObjectInput);
if (!deleteOutput.isSuccess()){
if(deleteOutput.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){
std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
}
}
}
// 列举已上传分片
ListMultipartUploadsV2Input input2(bucketName);
AbortMultipartUploadInput abortMultipartUploadInput;
abortMultipartUploadInput.setBucket(bucketName);
// isTruncated用于控制是否列举完全,nextKeyMarker用于递归列举
isTruncated = true;
nextKeyMarker = "";
while(isTruncated){
input2.setKeyMarker(nextKeyMarker);
auto output = client.listMultipartUploads(input2);
if (!output.isSuccess()) {
// 异常处理
std::cout << "ListMultipartUploads failed." << output.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
nextKeyMarker = output.result().getNextKeyMarker();
isTruncated = output.result().isTruncated();
std::cout << "ListMultipartUploads success." << std::endl;
for (const auto& part : output.result().getUploads()) {
abortMultipartUploadInput.setKey(part.getKey());
abortMultipartUploadInput.setUploadId(part.getUploadId());
auto abortOutput = client.abortMultipartUpload(abortMultipartUploadInput);
if (!abortOutput.isSuccess()){
std::cout << "DeletePart failed:" << abortOutput.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
}
}
// 释放网络等资源
CloseClient();
return 0;
}
以下代码用于清空整个开启多版本桶的示例代码,包括删除所有对象的多个版本、删除删除标记的多个版本、删除所有未合并的对象。
#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);
ListObjectVersionsV2Input input(bucketName);
bool isTruncated = true;
std::string nextKeyMarker = "";
std::string nextVersionIdMarker = "";
DeleteObjectInput deleteObjectInput;
deleteObjectInput.setBucket(bucketName);
while(isTruncated){
input.setKeyMarker(nextKeyMarker);
input.setVersionIdMarker(nextVersionIdMarker);
auto output = client.listObjectVersions(input);
if (!output.isSuccess()) {
// 异常处理
std::cout << "ListObjects failed." << output.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
nextKeyMarker = output.result().getNextKeyMarker();
nextVersionIdMarker = output.result().getNextVersionIdMarker();
isTruncated = output.result().isTruncated();
for (const auto& versions : output.result().getVersions()) {
deleteObjectInput.setKey(versions.getKey());
deleteObjectInput.setVersionID(versions.getVersionId());
auto deleteOutput = client.deleteObject(deleteObjectInput);
if (!deleteOutput.isSuccess()){
if(deleteOutput.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){
std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
}
}
for (const auto& deleteMarker : output.result().getDeleteMarkers()) {
deleteObjectInput.setKey(deleteMarker.getKey());
deleteObjectInput.setVersionID(deleteMarker.getVersionId());
auto deleteOutput = client.deleteObject(deleteObjectInput);
if (!deleteOutput.isSuccess()){
if(deleteOutput.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){
std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
}
}
}
// 列举已上传分片
ListMultipartUploadsV2Input input2(bucketName);
AbortMultipartUploadInput abortMultipartUploadInput;
abortMultipartUploadInput.setBucket(bucketName);
// isTruncated用于控制是否列举完全,nextKeyMarker用于递归列举
isTruncated = true;
nextKeyMarker = "";
while(isTruncated){
input2.setKeyMarker(nextKeyMarker);
auto output = client.listMultipartUploads(input2);
if (!output.isSuccess()) {
// 异常处理
std::cout << "ListMultipartUploads failed." << output.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
nextKeyMarker = output.result().getNextKeyMarker();
isTruncated = output.result().isTruncated();
std::cout << "ListMultipartUploads success." << std::endl;
for (const auto& part : output.result().getUploads()) {
abortMultipartUploadInput.setKey(part.getKey());
abortMultipartUploadInput.setUploadId(part.getUploadId());
auto abortOutput = client.abortMultipartUpload(abortMultipartUploadInput);
if (!abortOutput.isSuccess()){
std::cout << "DeletePart failed:" << abortOutput.error().String() << std::endl;
// 释放网络等资源
CloseClient();
return -1;
}
}
}
// 释放网络等资源
CloseClient();
return 0;
}