このトピックでは、バージョン管理が有効なバケットから、単一のオブジェクト、複数のオブジェクト、および名前に指定されたプレフィックスを含むオブジェクトを削除する方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。 OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。 カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化」をご参照ください。
オブジェクトを削除するには、
oss:DeleteObject権限が必要です。 詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。
バージョン管理が有効なバケットでの削除の動作
バージョン管理が有効なバケットでの削除の動作は次のとおりです:
バージョン ID を指定しない削除 (一時的な削除):
バージョン ID を指定せずにオブジェクトを削除した場合、OSS はオブジェクトを完全に削除しません。 代わりに、OSS は削除マーカーを追加し、それがオブジェクトのカレントバージョンになります。 オブジェクトを取得しようとすると、OSS は削除マーカーを検出し、
404 Not Foundエラーを返します。 応答には、header:x-oss-delete-marker = trueと、x-oss-version-id内の新しい削除マーカーのバージョン ID が含まれます。x-oss-delete-markerの値が true の場合、返されたx-oss-version-idに対応するバージョンが削除マーカーであることを示します。バージョン ID を指定した削除 (完全な削除):
削除操作で `versionId` を指定すると、OSS は
paramsパラメーターで指定されたversionIdを持つオブジェクトバージョンを完全に削除します。 `versionId` が文字列 "null" のオブジェクトバージョンを削除するには、params['versionId'] = "null"をparamsパラメーターに追加します。 この場合、OSS は文字列 "null" を `versionId` として扱い、対応するオブジェクトバージョンを削除します。
単一オブジェクトの削除
次の例は、バージョン管理が有効なバケットから単一のオブジェクトを完全にまたは一時的に削除する方法を示しています。
完全な削除
次のサンプルコードは、リクエストでオブジェクトのバージョン ID を指定することにより、バージョン管理が有効なバケットからオブジェクトバージョンを完全に削除する方法の例を示しています:
using Aliyun.OSS; using Aliyun.OSS.Common; // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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"); // バケット名を指定します。 例:examplebucket。 var bucketName = "examplebucket"; // オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 例:exampledir/exampleobject.txt。 var objectName = "exampledir/exampleobject.txt"; // オブジェクトのバージョン ID または削除マーカーを指定します。 var versionid = "yourObjectVersionidOrDelMarkerVersionid"; // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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); client.SetRegion(region); try { // 削除するオブジェクトのバージョン ID または削除マーカーを指定します。 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); }一時的な削除
次のサンプルコードは、バージョン ID が指定されていないリクエストを送信することにより、バージョン管理が有効なバケットからオブジェクトを一時的に削除する方法の例を示しています:
using Aliyun.OSS; using Aliyun.OSS.Common; // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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"); // バケット名を指定します。 例:examplebucket。 var bucketName = "examplebucket"; // オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 例:exampledir/exampleobject.txt。 var objectName = "exampledir/exampleobject.txt"; // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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); client.SetRegion(region); try { // バージョン ID を指定せずにオブジェクトを一時的に削除します。 オブジェクトに削除マーカーが追加されます。 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); }
複数オブジェクトの削除
次の例では、バージョン管理が有効なバケットから複数のオブジェクトを完全にまたは一時的に削除する方法について説明します。
完全な削除
次のサンプルコードは、バージョン管理が有効なバケットから、指定されたバージョン ID を持つ複数のオブジェクトまたは削除マーカーを完全に削除する方法の例を示しています:
using Aliyun.OSS; using Aliyun.OSS.Common; // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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"); // バケット名を指定します。 例:examplebucket。 var bucketName = "examplebucket"; // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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); client.SetRegion(region); try { // 指定されたバージョン ID のオブジェクト、またはカレントバージョンが指定されたバージョン ID の削除マーカーであるオブジェクトを削除します。 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); }一時的な削除
次のサンプルコードは、バージョン ID を指定せずに、バージョン管理が有効なバケットから複数のオブジェクトを一時的に削除する方法の例を示しています。 一時的に削除された後、オブジェクトのカレントバージョンを復元できます。
using Aliyun.OSS; using Aliyun.OSS.Common; // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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"); // バケット名を指定します。 例:examplebucket。 var bucketName = "examplebucket"; // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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); client.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 は quiet モードを示し、このモードでは削除されたオブジェクトは返されません。 false は verbose モードを示し、このモードでは削除されたオブジェクトが返されます。 デフォルト値は false です。 var quietMode = false; // DeleteObjectsRequest リクエストで quietMode の値を設定して、リターンモードを指定します。 var request = new DeleteObjectsRequest(bucketName, keys, quietMode); // バージョン ID を指定せずにオブジェクトを削除します。 オブジェクトに削除マーカーが追加されます。 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); }
特定のプレフィックスを含む名前のオブジェクトの削除
次のサンプルコードは、指定されたプレフィックスを含む名前のオブジェクトを削除する方法の例を示しています:
using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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");
// バケット名を指定します。 例:examplebucket。
var bucketName = "examplebucket";
var prefix = "yourkeyPrefix";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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);
client.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」をご参照ください。