本文介绍如何在受版本控制的存储空间(Bucket)中删除单个或多个文件(Object))以及指定前缀的(Prefix)的文件。
版本控制下的删除行为
版本控制下的删除行为说明如下:
- 未指定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进行永久删除:
using Aliyun.OSS; var endpoint = "<yourEndpoint>"; var accessKeyId = "<yourAccessKeyId>"; var accessKeySecret = "<yourAccessKeySecret>"; var bucketName = "<yourBucketName>"; var objectName = "<yourObjectName>"; var versionid = "<yourObjectVersionidOrDelMarkerVersionid>"; // 创建OssClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { // 指定Object的versionId,也可以是删除标记的versionId。 var request = new DeleteObjectRequest(bucketName, key) { VersionId = versionid }; client.DeleteObject(request); Console.WriteLine("Delete object succeeded"); } catch (Exception ex) { Console.WriteLine("Delete object failed. {0}", ex.Message); }
- 临时删除
以下代码用于不指定versionId对Object进行临时删除:
using Aliyun.OSS; var endpoint = "<yourEndpoint>"; var accessKeyId = "<yourAccessKeyId>"; var accessKeySecret = "<yourAccessKeySecret>"; var bucketName = "<yourBucketName>"; var objectName = "<yourObjectName>"; // 创建OssClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { // 不指定versionId对Object进行临时删除,此操作会为Object添加删除标记。 var result = client.DeleteObject(bucketName, objectName); Console.WriteLine("Delete object succeeded, versionid: {0}, DeleteMarker: {1}", result.VersionId, result.DeleteMarker); } catch (Exception ex) { Console.WriteLine("Delete object failed. {0}", ex.Message); }
删除单个文件的详细信息请参见DeleteObject。
删除多个文件
以下提供了永久删除以及临时删除多个Object的示例。
- 永久删除
以下代码用于指定versionId对多个Object及删除标记进行永久删除:
using Aliyun.OSS; using Aliyun.OSS.Common; var endpoint = "<yourEndpoint>"; var accessKeyId = "<yourAccessKeyId>"; var accessKeySecret = "<yourAccessKeySecret>"; var bucketName = "<yourBucketName>"; // 创建OSSClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { // 删除指定版本的object或指定删除标记版本关联的Object。 var obj1 = new ObjectIdentifier { Key = "yourObject1Name", VersionId = "yourObject1NameVersionid" }; var obj2 = new ObjectIdentifier { Key = "yourObject2Name", VersionId = "yourObject2DelMarkerVersionid" }; IList<ObjectIdentifier> objects = new List<ObjectIdentifier>(); objects.Add(obj1); objects.Add(obj2); var request = new DeleteObjectVersionsRequest(bucketName, objects); // 发起deleteVersions请求。 client.DeleteObjectVersions(request); Console.WriteLine("DeleteObjectVersions succeeded "); } catch (OssException ex) { Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine("Failed with error info: {0}", ex.Message); }
删除多个文件的详细信息请参见DeleteMultipleObjects。
- 临时删除
以下代码用于不指定versionId对多个Object进行临时删除:
using Aliyun.OSS; var endpoint = "<yourEndpoint>"; var accessKeyId = "<yourAccessKeyId>"; var accessKeySecret = "<yourAccessKeySecret>"; var bucketName = "<yourBucketName>"; // 创建OssClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { var keys = new List<string>(); var listResult = client.ListObjects(bucketName); foreach (var summary in listResult.ObjectSummaries) { keys.Add(summary.Key); } // quietMode为true表示简单模式,即返回删除失败的文件列表。quietMode为false表示详细模式,即返回删除成功的文件列表。默认为详细模式。 var quietMode = false; // 通过DeleteObjectsRequest的quietMode参数指定返回模式。 var request = new DeleteObjectsRequest(bucketName, keys, quietMode); // 执行不指定versionId的删除操作后,将为Object添加删除标记。 var result = client.DeleteObjects(request); if ((!quietMode) && (result.Keys != null)) { foreach (var obj in result.Keys) { Console.WriteLine("Delete successfully : {0} ", obj.Key); } } Console.WriteLine("Delete objects succeeded"); } catch (Exception ex) { Console.WriteLine("Delete objects failed. {0}", ex.Message); }
删除指定前缀的文件
以下代码用于删除指定前缀(prefix)的文件:
using Aliyun.OSS;
using Aliyun.OSS.Common;
var endpoint = "<yourEndpoint>";
var accessKeyId = "<yourAccessKeyId>";
var accessKeySecret = "<yourAccessKeySecret>";
var bucketName = "<yourBucketName>";
var prefix = "<yourkeyPrefix>";
// 创建OssClient实例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
ObjectVersionList result = null;
var request = new ListObjectVersionsRequest(bucketName)
{
//指定前缀。
Prefix = prefix;
};
// 列举所有指定前缀的文件的版本信息并删除这些文件。
do {
result = client.ListObjectVersions(request);
Console.WriteLine("ListObjectVersions succeeded");
foreach (var deleteversion in result.DeleteMarkerSummaries)
{
var request = new DeleteObjectRequest(bucketName, deleteversion.Key)
{
VersionId = deleteversion.VersionId
};
client.DeleteObject(request);
}
foreach (var objectversion in result.ObjectVersionSummaries)
{
var request = new DeleteObjectRequest(bucketName, objectversion.Key)
{
VersionId = objectversion.VersionId
};
client.DeleteObject(request);
}
request.KeyMarker = result.NextKeyMarker;
request.NextVersionIdMarker = result.NextVersionIdMarker ;
} while (result.IsTruncated)
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}