You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AWS C++ SDK的ListObjects()访问S3存储桶子文件夹

解决AWS C++ SDK ListObjects列出S3指定子路径对象的问题

问题根源

你错误地将桶名+子路径合并作为bucketName传入ListObjects函数,而S3的ListObjects接口要求bucketName仅为纯桶名,目标子路径需要通过Prefix参数来指定过滤条件。

修改后的代码实现

调整ListObjects函数,支持前缀过滤

bool ListObjects(const Aws::String& bucketName, 
                 const Aws::String& prefix,
                 const Aws::Client::ClientConfiguration& clientConfig) {
    Aws::S3::S3Client s3_client(clientConfig);

    Aws::S3::Model::ListObjectsRequest request;
    request.WithBucket(bucketName);
    // 设置前缀,过滤出目标子路径下的对象
    request.WithPrefix(prefix);
    // 可选:添加Delimiter参数,仅列出当前路径下的对象(不递归子目录)
    request.WithDelimiter("/");

    auto outcome = s3_client.ListObjects(request);

    if (!outcome.IsSuccess()) {
        std::cerr << "Error: ListObjects: " <<
            outcome.GetError().GetMessage() << std::endl;
    }
    else {
        Aws::Vector<Aws::S3::Model::Object> objects =
            outcome.GetResult().GetContents();

        for (Aws::S3::Model::Object& object : objects) {
            std::cout << object.GetKey() << std::endl;
        }
    }
    return outcome.IsSuccess();
}

正确的调用代码

Aws::SDKOptions options;
Aws::InitAPI(options);
Aws::Client::ClientConfiguration clientConfig; 
std::string bucketName = "noaa-goes16";
// 指定目标子路径作为前缀,末尾添加"/"确保精准匹配该路径下的内容
std::string prefix = "GLM-L2-LCFA/2021/140/05/";
ListObjects(bucketName, prefix, clientConfig);

关键说明

  • WithPrefix(prefix):核心参数,告诉S3仅返回Key以指定前缀开头的对象,精准过滤出目标子路径下的内容。
  • WithDelimiter("/"):可选配置,若需要模拟"目录"行为,只列出当前路径下的直接对象(不递归子目录)则添加该参数;若需要递归列出所有子路径下的对象,可删除此配置。
  • 必须将桶名和子路径分开传递,不能合并为一个字符串作为bucketName参数。

内容的提问来源于stack exchange,提问作者Corey4005

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:31:07