#include "TosClientV2.h"
using namespace VolcengineTos;
std::string region = "Your Region";
std::string accessKey = std::getenv("TOS_ACCESS_KEY");
std::string secretKey = std::getenv("TOS_SECRET_KEY");
std::string bucketName = "examplebucket";
TosClientV2 client(region, accessKey, secretKey);
ListObjectVersionsV2Input input(bucketName);
bool isTruncated = true;
std::string nextKeyMarker = "";
std::string nextVersionIdMarker = "";
DeleteObjectInput deleteObjectInput;
deleteObjectInput.setBucket(bucketName);
input.setKeyMarker(nextKeyMarker);
input.setVersionIdMarker(nextVersionIdMarker);
auto output = client.listObjectVersions(input);
if (!output.isSuccess()) {
std::cout << "ListObjects failed." << output.error().String() << std::endl;
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(output.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){
std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl;
for (const auto& deleteMarker : output.result().getDeleteMarkers()) {
deleteObjectInput.setKey(deleteMarker.getKey());
deleteObjectInput.setVersionID(deleteMarker.getVersionId());
auto deleteOutput = client.deleteObject(deleteObjectInput);
if (!deleteOutput.isSuccess()){
if(output.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){
std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl;
ListMultipartUploadsV2Input input2(bucketName);
AbortMultipartUploadInput abortMultipartUploadInput;
abortMultipartUploadInput.setBucket(bucketName);
input2.setKeyMarker(nextKeyMarker);
auto output = client.listMultipartUploads(input2);
if (!output.isSuccess()) {
std::cout << "ListMultipartUploads failed." << output.error().String() << std::endl;
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;