本文介绍如何在受版本控制的存储空间(Bucket)中删除单个或多个文件(Object)以及删除指定前缀的(Prefix)的文件。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见 访问域名和数据中心
  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见 新建OssClient
  • 要删除文件,您必须有 oss:DeleteObject 权限。具体操作,请参见 为RAM用户授权自定义的权限策略

版本控制下的删除行为

版本控制下的删除行为说明如下:

  • 未指定versionId(临时删除):

    如果在未指定versionId的情况下执行删除操作时,默认不会删除Object的当前版本,而是对当前版本插入删除标记(Delete Marker)。当执行GetObject操作时,OSS会检测到当前版本为删除标记,并返回 404 Not Found 。此外,响应中会返回 header:x-oss-delete-marker = true 以及新生成的删除标记的版本号 x-oss-version-id

    x-oss-delete-marker 的值为true,表示与返回的 x-oss-version-id 对应的版本为删除标记。

  • 指定versionId(永久删除):

    如果在指定versionId的情况下执行删除操作时,OSS会根据 params 中指定的 versionId 参数永久删除该版本。如果要删除ID为“null”的版本,请在 params 参数中添加 params['versionId'] = “null” ,OSS将“null”字符串当成“null”的versionId,从而删除versionId为“null”的Object。

删除单个文件

以下提供了永久删除及临时删除单个Object的示例。

  • 永久删除

    以下代码用于指定versionId对Object的指定版本进行永久删除。

    #include <alibabacloud/oss/OssClient.h>
    using namespace AlibabaCloud::OSS;
    int main(void)
        /* 初始化OSS账号信息。*/
        /* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
        std::string AccessKeyId = "yourAccessKeyId";
        std::string AccessKeySecret = "yourAccessKeySecret";
        /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
        std::string Endpoint = "yourEndpoint";
        /* 填写Bucket名称,例如examplebucket。*/
        std::string BucketName = "examplebucket";
        /* 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。*/
        std::string ObjectName = "exampledir/exampleobject.txt";
        /* 初始化网络等资源。*/
        InitializeSdk();
        ClientConfiguration conf;
        OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
        /* 删除指定versionId的Object或指定versionId的删除标记关联的Object。*/
        auto outcome = client.DeleteObject(DeleteObjectRequest(BucketName, ObjectName, "yourObjectVersionIdOrDeleteMarkerVersionId"));
        /* 如果指定的是Object的versionId,则返回的delete_marker为None且返回的versionId为指定Object的versionId。*/
        /* 如果指定的是删除标记的versionId,则返回的delete_marker为True且返回的versionId为指定删除标记的versionId。*/
        if (!outcome.isSuccess()) {
            /* 异常处理。*/
            std::cout << "DeleteObject fail" <<
            ",code:" << outcome.error().Code() <<
            ",message:" << outcome.error().Message() <<
            ",requestId:" << outcome.error().RequestId() << std::endl;
            return -1;
        /* 释放网络等资源。*/
        ShutdownSdk();
        return 0;
    }
  • 临时删除

    以下代码用于不指定versionId对Object进行临时删除。

    #include <alibabacloud/oss/OssClient.h>
    using namespace AlibabaCloud::OSS;
    int main(void)
        /* 初始化OSS账号信息。*/
        /* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
        std::string AccessKeyId = "yourAccessKeyId";
        std::string AccessKeySecret = "yourAccessKeySecret";
        /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
        std::string Endpoint = "yourEndpoint";
        /* 填写Bucket名称,例如examplebucket。*/
        std::string BucketName = "examplebucket";
        /* 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。*/
        std::string ObjectName = "exampledir/exampleobject.txt";
        /* 初始化网络等资源。*/
        InitializeSdk();
        ClientConfiguration conf;
        OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
        DeleteObjectRequest request(BucketName, ObjectName);
        /* 不指定versionId对Object进行临时删除,此操作会为Object添加删除标记。*/
        auto outcome = client.DeleteObject(request);
        /* 查看返回删除标记的versionId。*/
        if (outcome.isSuccess()) {
            std::cout << "versionid:" << outcome.result().VersionId() << ",DeleteMarker:" << outcome.result().DeleteMarker() << std::endl;
        else {
            /* 异常处理。*/
            std::cout << "PutObject fail" <<
            ",code:" << outcome.error().Code() <<
            ",message:" << outcome.error().Message() <<
            ",requestId:" << outcome.error().RequestId() << std::endl;
            return -1;
        /* 释放网络等资源。*/
        ShutdownSdk();
        return 0;
    }

删除多个文件

以下提供了永久删除以及临时删除多个Object的示例。

  • 永久删除

    以下代码用于永久删除多个指定versionId的Object或指定versionId的删除标记关联的Object。

    #include <alibabacloud/oss/OssClient.h>
    using namespace AlibabaCloud::OSS;
    int main(void)
        /* 初始化OSS账号信息。*/
        /* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
        std::string AccessKeyId = "yourAccessKeyId";
        std::string AccessKeySecret = "yourAccessKeySecret";
        /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
        std::string Endpoint = "yourEndpoint";
        /* 填写Bucket名称,例如examplebucket。*/
        std::string BucketName = "examplebucket";
        /* 初始化网络等资源。*/
        InitializeSdk();
        ClientConfiguration conf;
        OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
        DeleteObjectVersionsRequest  request(BucketName);
        /* 添加需要删除的Object或删除标记的versionId。*/
        ObjectIdentifier obj1("yourObject1Name");
        obj1.setVersionId("yourVersionId");
        ObjectIdentifier obj2("yourObject2Name");
        obj2.setVersionId("obj2_del_marker_versionid");
        request.addObject(obj1);
        request.addObject(obj2);
        /* 批量删除指定versionId的Object或指定删除标记versionId关联的Object。*/
        auto outcome = client.DeleteObjectVersions(request);
        if (!outcome.isSuccess()) {
            /* 异常处理。*/
            std::cout << "DeleteObjectVersions fail" <<
            ",code:" << outcome.error().Code() <<
            ",message:" << outcome.error().Message() <<
            ",requestId:" << outcome.error().RequestId() << std::endl;
            return -1;
        /* 释放网络等资源。*/
        ShutdownSdk();
        return 0;
    }
  • 临时删除

    以下代码用于不指定versionId对多个Object进行临时删除。

    #include <alibabacloud/oss/OssClient.h>
    using namespace AlibabaCloud::OSS;
    int main(void)
        /* 初始化OSS账号信息。*/
        /* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
        std::string AccessKeyId = "yourAccessKeyId";
        std::string AccessKeySecret = "yourAccessKeySecret";
        /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
        std::string Endpoint = "yourEndpoint";
        /* 填写Bucket名称,例如examplebucket。*/
        std::string BucketName = "examplebucket";
        /* 初始化网络等资源。*/
        InitializeSdk();
        ClientConfiguration conf;
        OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
        DeleteObjectVersionsRequest request(BucketName);
        /* 填写要删除Object的名称。*/
        ObjectIdentifier obj1(ObjectName1);
        ObjectIdentifier obj2(ObjectName2);
        ObjectIdentifier obj3(ObjectName3);
        request.addObject(obj1);
        request.addObject(obj2);
        request.addObject(obj3);
        /* 删除Object。*/
        auto outcome = client.DeleteObjectVersions(request);
        if (outcome.isSuccess()) {
            for (auto const &obj : outcome.result().DeletedObjects()) {
                std::cout << "versionid:" << obj.VersionId() << ",DeleteMarker:" << obj.DeleteMarker() << std::endl;
        else {
            /* 异常处理。*/
            std::cout << "DeleteObjectVersions fail" <<
            ",code:" << outcome.error().Code() <<
            ",message:" << outcome.error().Message() <<
            ",requestId:" << outcome.error().RequestId() << std::endl;
            return -1;
        /* 释放网络等资源。*/
        ShutdownSdk();
        return 0;
    }

删除指定前缀的文件

以下代码用于删除指定前缀(prefix)的文件。

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
    /* 初始化OSS账号信息。*/
    /* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
    std::string AccessKeyId = "yourAccessKeyId";
    std::string AccessKeySecret = "yourAccessKeySecret";
    /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 初始化网络等资源。*/
    InitializeSdk();
    ClientConfiguration conf;
    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
    ListObjectVersionsRequest request(BucketName);
    bool IsTruncated = false;
            request.setPrefix("yourkeyPrefix");
            auto outcome = client.ListObjectVersions(request);
            if (outcome.isSuccess()) {
                /* 查看列举的Object以及删除标记的各版本信息。*/
                for (auto const &marker : outcome.result().DeleteMarkerSummarys()) {
                   client.DeleteObject(DeleteObjectRequest(bucket, marker.Key(), marker.VersionId()));
                /* 列举所有指定前缀的Object的版本信息并删除这些文件。*/
                for (auto const &obj : outcome.result().ObjectVersionSummarys()) {
                     client.DeleteObject(DeleteObjectRequest(bucket, obj.Key(), obj.VersionId()));
            else {
                std::cout << "ListObjectVersions fail" <<
                ",code:" << outcome.error().Code() <<
                ",message:" << outcome.error().Message() <<
                ",requestId:" << outcome.error().RequestId() << std::endl;
                break;
            request.setKeyMarker(outcome.result().NextKeyMarker());
            request.setVersionIdMarker(outcome.result().NextVersionIdMarker());
            IsTruncated = outcome.result().IsTruncated();
    } while (IsTruncated);
    /* 释放网络等资源。*/
    ShutdownSdk();
    return 0;
}

相关文档