全部產品
Search
文件中心

Object Storage Service:.NET刪除檔案

更新時間:Jun 19, 2024

本文介紹如何在受版本控制的儲存空間(Bucket)中刪除單個或多個檔案(Object))以及指定首碼的(Prefix)的檔案。

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見訪問網域名稱和資料中心

  • 本文以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";
    // 建立OSSClient執行個體。
    var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
    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";
    // 建立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);
    }

刪除多個檔案

以下提供了永久刪除以及臨時刪除多個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";
    // 建立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);
    }
  • 臨時刪除

    以下代碼用於不指定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";
    // 建立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表示簡單模式,即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";
// 建立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);
}

相關文檔