本文介紹如何在受版本控制的儲存空間(Bucket)中刪除單個或多個檔案(Object))以及指定首碼的(Prefix)的檔案。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要刪除檔案,您必須有
oss:DeleteObject
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
版本控制下的刪除行為
版本控制下的刪除行為說明如下:
未指定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; // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "yourEndpoint"; // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // 填寫Bucket名稱,例如examplebucket。 var bucketName = "examplebucket"; // 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。 var objectName = "exampledir/exampleobject.txt"; // 填寫Object的版本ID或刪除標記的版本ID。 var versionid = "yourObjectVersionidOrDelMarkerVersionid"; // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); try { // 指定Object的versionId,也可以是刪除標記的versionId。 var request = new DeleteObjectRequest(bucketName, objectName) { 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; // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "yourEndpoint"; // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // 填寫Bucket名稱,例如examplebucket。 var bucketName = "examplebucket"; // 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。 var objectName = "exampledir/exampleobject.txt"; // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); 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); }
刪除多個檔案
以下提供了永久刪除以及臨時刪除多個Object的樣本。
永久刪除
以下代碼用於指定versionId對多個Object及刪除標記進行永久刪除:
using Aliyun.OSS; using Aliyun.OSS.Common; // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "yourEndpoint"; // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // 填寫Bucket名稱,例如examplebucket。 var bucketName = "examplebucket"; // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); 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); }
臨時刪除
以下代碼用於不指定versionId對多個Object進行臨時刪除。臨時刪除後,支援恢複該版本的Object。
using Aliyun.OSS; // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "yourEndpoint"; // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // 填寫Bucket名稱,例如examplebucket。 var bucketName = "examplebucket"; // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); try { var keys = new List<string>(); var listResult = client.ListObjects(bucketName); foreach (var summary in listResult.ObjectSummaries) { keys.Add(summary.Key); } // quietMode為true表示簡單模式,即OSS不返回訊息體。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;
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
var prefix = "yourkeyPrefix";
// 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
var conf = new ClientConfiguration();
// 設定v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
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);
}
相關文檔
關於刪除單個檔案的API介面說明,請參見DeleteObject。
關於刪除多個檔案的API介面說明,請參見DeleteMultipleObjects。