C++删除文件

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

您可以根据需要删除单个文件(Object)、删除指定的多个文件、删除指定前缀的文件或者删除指定目录及目录下的所有文件。

警告

请您谨慎使用删除操作,文件删除后将无法恢复。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见新建OssClient

  • 要删除文件,您必须具有oss:DeleteObject权限。具体操作,请参见为RAM用户授权自定义的权限策略

删除单个文件

以下代码用于删除examplebucket中的exampleobject.txt文件。

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS账号信息。*/
            
    /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填写Object完整路径,例如exampleobject.txt。Object完整路径中不能包含Bucket名称。*/
    /* 当要删除目录时,请将ObjectName设置为对应的目录名称。如果目录非空,则需要将目录下的所有Object删除后才能删除该目录。*/
    std::string ObjectName = "exampleobject.txt";

    /* 初始化网络等资源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
   
    DeleteObjectRequest request(BucketName, ObjectName);

    /* 删除文件。*/
    auto outcome = client.DeleteObject(request);

    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;
}

批量删除文件

手动删除文件时,每次最多删除1000个文件。您可以删除指定的多个文件、删除指定前缀的文件或者删除指定目录及目录下的所有文件。

手动删除多个文件时,返回结果包括如下两种模式,默认返回模式为详细模式,请根据实际选择返回模式。

  • 详细模式(verbose):返回所有删除的文件列表。

  • 简单模式(quiet):只返回删除失败的文件列表。

OSS还支持通过设置生命周期规则来自动删除文件。更多信息,请参见基于最后一次修改时间的生命周期规则

删除指定名称的多个文件

以下代码用于删除指定名称的多个文件。

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS账号信息。*/
            
    /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";

    /* 初始化网络等资源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    DeleteObjectsRequest request(BucketName);
    /* 添加要删除的多个Object的完整路径。*/
    request.addKey("yourObjectName1");
    request.addKey("yourObjectName2");
  
    /* 删除文件。*/
    auto outcome = client.DeleteObjects(request);

    if (!outcome.isSuccess()) {
        /* 异常处理。*/
        std::cout << "DeleteObjects fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* 释放网络等资源。*/
    ShutdownSdk();
    return 0;
}

删除指定前缀或目录下的多个文件

以下代码用于删除指定前缀的多个文件或者指定目录(文件夹)及目录下的所有文件。

警告

如果以下示例代码中前缀keyPrefix的值为空字符串或者NULL,将会删除整个Bucket内的所有文件,请谨慎使用。

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS账号信息。*/
            
    /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 如果您需要删除所有前缀为src的文件,则prefix设置为src。设置为src后,所有前缀为src的非目录文件、src目录以及目录下的所有文件均会被删除。。*/
    std::string keyPrefix = "src";
    /* 如果您仅需要删除src目录及目录下的所有文件,则prefix设置为src/。*/
    /* std::string keyPrefix = "src/"; */

    /* 初始化网络等资源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    std::string nextMarker = "";
    bool isTruncated = false;
    do {
            /* 列举文件。*/
            ListObjectsRequest request(BucketName);           
            request.setPrefix(keyPrefix);
            request.setMarker(nextMarker);
            auto outcome = client.ListObjects(request);

            if (!outcome.isSuccess()) {
                /* 异常处理。*/
                std::cout << "ListObjects fail" <<
                ",code:" << outcome.error().Code() <<
                ",message:" << outcome.error().Message() <<
                ",requestId:" << outcome.error().RequestId() << std::endl;
                break;
            }
            for (const auto& object : outcome.result().ObjectSummarys()) {
                DeleteObjectRequest request(BucketName, object.Key());
                /* 删除文件。*/
                auto delResult = client.DeleteObject(request);
            }
            nextMarker = outcome.result().NextMarker();
            isTruncated = outcome.result().IsTruncated();
    } while (isTruncated);

    /* 释放网络等资源。*/
    ShutdownSdk();
    return 0;
}

相关文档

  • 关于删除单个或多个文件的完整示例代码,请参见GitHub示例

  • 关于删除单个文件的API接口说明,请参见DeleteObject

  • 关于删除多个文件的API接口说明,请参见DeleteMultipleObjects