当对象不会再使用时,您可以删除对象,降低成本开销。目前 TOS C++ SDK 支持删除桶中的单个对象、删除指定的多个对象,对于开启多版本的桶,你可指定删除对象的任意版本数据。
tos:DeleteObject
权限,具体操作请参见权限配置指南。tos:DeleteObjectVersion
权限,具体操作请参见权限配置指南。Suspended
时,删除版本为 null
的对象,并产生一个版本为 null
的删除标记。多版本状态下,指定版本删除将删除指定版本号的对象。以下代码用于删除指定桶 examplebucket
中的 exampledir/exampleobject.txt
对象。
#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"; // 填写 Object 完整路径,完整路径中不能包含 Bucket 名称,例如 exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); DeleteObjectInput input(bucketName,objectName); auto output = client.deleteObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "DeleteObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "DeleteObject success." << std::endl; std::cout << " version id is:" << output.result().getVersionId() << " request id is:" << output.result().getRequestInfo().getRequestId() << " is delete marker:" << output.result().isDeleteMarker() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
以下代码用于删除指定开启多版本桶 examplebucket
中的 exampledir/exampleobject.txt
对象的指定版本数据。
#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"; // 填写 Object 完整路径,完整路径中不能包含 Bucket 名称,例如 exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 填写对象的 versionId std::string versionId = "your object version"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); DeleteObjectInput input(bucketName,objectName); input.setVersionID(versionId); auto output = client.deleteObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "DeleteObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "DeleteObject success." << std::endl; std::cout << " version id is:" << output.result().getVersionId() << " is delete marker:" << output.result().isDeleteMarker() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
注意
versionId
,将插入删除标记。如果指定了versionId
,将永久删除该对象的指定版本。quiet
进行设置:
quiet
为false
时,是指在返回响应时,不管对象是否删除成功都将删除结果包含在响应里。quiet
为true
时,是指在返回响应时,只返回删除失败的对象结果,没有返回的认为删除成功。批量删除对象
以下代码用于删除桶 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"; // 填写 Object 完整路径,完整路径中不能包含 Bucket 名称,例如 exampledir/exampleobject1.txt和exampledir/exampleobject2.txt。 std::string objectName1 = "exampledir/exampleobject1.txt"; std::string objectName2 = "exampledir/exampleobject2.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); DeleteMultiObjectsInput input; input.setBucket(bucketName); ObjectTobeDeleted object1(objectName1); ObjectTobeDeleted object2(objectName2); input.addObjectTobeDeleted(object1); input.addObjectTobeDeleted(object2); auto output = client.deleteMultiObjects(input); if (!output.isSuccess()) { // 异常处理 std::cout << "DeleteMultiObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "DeleteMultiObjects success." << std::endl; for(auto& deleted : output.result().getDeleteds()){ std::cout << " object key is:" << deleted.getKey() << " object version id is:" << deleted.getVersionId() << " is delete marker:" << deleted.isDeleteMarker() << " delete marker version id is:" << deleted.getDeleteMarkerVersionId()<< std::endl; } for(auto& error : output.result().getErrors()){ std::cout << " delete err object key is:" << error.getKey() << " delete err object version id is:" << error.getVersionId() << " delete err message:" << error.getMessage() << 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"; // 填写 Object 完整路径,完整路径中不能包含 Bucket 名称,例如exampledir/exampleobject1.txt和exampledir/exampleobject2.txt。 std::string objectName1 = "exampledir/exampleobject1.txt"; std::string objectName2 = "exampledir/exampleobject2.txt"; // 填写对象的 versionId std::string versionId1 = "your object1 version"; std::string versionId2 = "your object2 version"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); DeleteMultiObjectsInput input; input.setBucket(bucketName); ObjectTobeDeleted object1(objectName1,versionId1); ObjectTobeDeleted object2(objectName2,versionId2); input.addObjectTobeDeleted(object1); input.addObjectTobeDeleted(object2); // 桶开启多版本并指定删除对象的版本号,则为直接标删除 auto output = client.deleteMultiObjects(input); if (!output.isSuccess()) { // 异常处理 std::cout << "DeleteMultiObjects failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "DeleteMultiObjects success." << std::endl; for(auto& deleted : output.result().getDeleteds()){ std::cout << " object key is:" << deleted.getKey() << " object version id is:" << deleted.getVersionId() << " is delete marker:" << deleted.isDeleteMarker() << " delete marker version id is:" << deleted.getDeleteMarkerVersionId()<< std::endl; } for(auto& error : output.result().getErrors()){ std::cout << " delete err object key is:" << error.getKey() << " delete err object version id is:" << error.getVersionId() << " delete err message:" << error.getMessage() << std::endl; } // 释放网络等资源 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"; // 填写列举的文件前缀(Prefix)。 std::string prefix = "yourkeyPrefix"; // 初始化网络等资源 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()); 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; // 释放网络等资源 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(output.error().getStatusCode() != 404 && output.error().getCode() != "NoSuchKey"){ std::cout << "DeleteObject failed:" << deleteOutput.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } } } } // 释放网络等资源 CloseClient(); return 0; }