如何通过C# SDK获取AWS S3版本控制桶的DeleteMarkers?
解决S3启用版本控制后获取删除版本与Delete Marker的问题
AWSSDK.S3 NuGet包完全可以实现该功能
默认情况下,S3的常规列表接口(如ListObjectsV2)只会返回最新的非删除版本对象,因此你需要调用专门的版本列表接口,或者修改请求参数来获取删除相关的版本信息:
方法1:使用ListObjectVersions接口(推荐)
这个接口专门用于列出存储桶内的所有对象版本,包括已删除的对象版本和Delete Marker。示例代码如下:
using Amazon.S3; using Amazon.S3.Model; var s3Client = new AmazonS3Client(); var request = new ListObjectVersionsRequest { BucketName = "你的存储桶名称" }; var response = await s3Client.ListObjectVersionsAsync(request); // 遍历所有对象版本(包括已被删除的非标记版本) foreach (var version in response.Versions) { Console.WriteLine($"对象键: {version.Key}, 版本ID: {version.VersionId}, 最后修改时间: {version.LastModified}, 是否被删除: {version.IsDeleteMarker}"); } // 遍历所有Delete Marker记录 foreach (var marker in response.DeleteMarkers) { Console.WriteLine($"对象键: {marker.Key}, Delete Marker版本ID: {marker.VersionId}, 创建时间: {marker.LastModified}"); }
方法2:修改ListObjectsV2的请求参数
如果你想通过ListObjectsV2接口获取相关信息,需要开启两个参数:
- 将
IncludeDeletedObjects设为true:返回包含Delete Marker的结果 - 将
IncludeVersions设为true:返回所有对象版本
示例代码:
var request = new ListObjectsV2Request { BucketName = "你的存储桶名称", IncludeDeletedObjects = true, IncludeVersions = true }; var response = await s3Client.ListObjectsV2Async(request); // 遍历返回的所有条目,区分普通版本和Delete Marker foreach (var item in response.S3Objects) { if (item.IsDeleteMarker) { Console.WriteLine($"Delete Marker - 键: {item.Key}, 版本ID: {item.VersionId}"); } else { Console.WriteLine($"对象版本 - 键: {item.Key}, 版本ID: {item.VersionId}"); } }
其他AWS SDK同样支持该功能
所有AWS官方SDK(如Python的boto3、Java的AWS SDK for Java、Go的AWS SDK for Go等)都支持获取S3对象版本和Delete Marker信息,因为这是S3 REST API的标准功能。不同SDK的实现逻辑与.NET SDK一致:只需调用对应版本列表的接口(如boto3的list_object_versions、Java的listObjectVersions),或修改列表请求的参数来开启版本和删除记录的返回。
内容的提问来源于stack exchange,提问作者Brondahl
相关产品推荐
相关产品推荐

