如何通过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
相关产品推荐
相关产品推荐

