public static void DeleteBucketWithObjects(IAmazonS3 s3Client, string bucketName) { // Validations. if (s3Client == null) { throw new ArgumentNullException("s3Client", "The s3Client cannot be null!"); } if (string.IsNullOrEmpty(bucketName)) { throw new ArgumentNullException("bucketName", "The bucketName cannot be null or empty string!"); } var listVersionsRequest = new ListVersionsRequest { BucketName = bucketName }; ListVersionsResponse listVersionsResponse = null; string lastRequestId = null; var exception = new Exception(); var mre = new AutoResetEvent(false); // Iterate through the objects in the bucket and delete them. do { // List all the versions of all the objects in the bucket. s3Client.ListVersionsAsync(listVersionsRequest, (result) => { exception = result.Exception; listVersionsResponse = result.Response; mre.Set(); }, new AsyncOptions() { ExecuteCallbackOnMainThread = false }); mre.WaitOne(); Utils.AssertExceptionIsNull(exception); lastRequestId = listVersionsResponse.ResponseMetadata.RequestId; if (listVersionsResponse.Versions.Count == 0) { // If the bucket has no objects break the loop. break; } var keyVersionList = new List<KeyVersion>(listVersionsResponse.Versions.Count); for (int index = 0; index < listVersionsResponse.Versions.Count; index++) { keyVersionList.Add(new KeyVersion { Key = listVersionsResponse.Versions[index].Key, VersionId = listVersionsResponse.Versions[index].VersionId }); } var deleteObjectsResponse = new DeleteObjectsResponse(); // Delete the current set of objects. s3Client.DeleteObjectsAsync(new DeleteObjectsRequest { BucketName = bucketName, Objects = keyVersionList, Quiet = true }, (result) => { deleteObjectsResponse = result.Response; exception = result.Exception; mre.Set(); }, new AsyncOptions() { ExecuteCallbackOnMainThread = false }); mre.WaitOne(); Utils.AssertExceptionIsNull(exception); // Set the markers to get next set of objects from the bucket. listVersionsRequest.KeyMarker = listVersionsResponse.NextKeyMarker; listVersionsRequest.VersionIdMarker = listVersionsResponse.NextVersionIdMarker; } // Continue listing objects and deleting them until the bucket is empty. while (listVersionsResponse.IsTruncated); // Bucket is empty, delete the bucket. s3Client.DeleteBucketAsync(new DeleteBucketRequest { BucketName = bucketName }, (result) => { exception = result.Exception; mre.Set(); }, new AsyncOptions() { ExecuteCallbackOnMainThread = false }); mre.WaitOne(); Utils.AssertExceptionIsNull(exception); }
/// <summary> /// Deletes an S3 bucket which contains objects. /// An S3 bucket which contains objects cannot be deleted until all the objects /// in it are deleted. The function deletes all the objects in the specified /// bucket and then deletes the bucket itself. /// </summary> /// <param name="bucketName">The bucket to be deleted.</param> /// <param name="s3Client">The Amazon S3 Client to use for S3 specific operations.</param> /// <param name="deleteOptions">Options to control the behavior of the delete operation.</param> /// <param name="updateCallback">The callback which is used to send updates about the delete operation.</param> /// <param name="token">token to check if the operation has been request to cancel.</param> private static async Task DeleteS3BucketWithObjectsInternalAsync(IAmazonS3 s3Client, string bucketName, S3DeleteBucketWithObjectsOptions deleteOptions, Action<S3DeleteBucketWithObjectsUpdate> updateCallback, CancellationToken token) { // Validations. if (s3Client == null) { throw new ArgumentNullException("s3Client", "The s3Client cannot be null!"); } if (string.IsNullOrEmpty(bucketName)) { throw new ArgumentNullException("bucketName", "The bucketName cannot be null or empty string!"); } var listVersionsRequest = new ListVersionsRequest { BucketName = bucketName }; ListVersionsResponse listVersionsResponse; // Iterate through the objects in the bucket and delete them. do { // Check if the operation has been canceled. if (token.IsCancellationRequested) { // Signal that the operation is canceled. return; } // List all the versions of all the objects in the bucket. listVersionsResponse = await s3Client.ListVersionsAsync(listVersionsRequest,token).ConfigureAwait(false); if (listVersionsResponse.Versions.Count == 0) { // If the bucket has no objects break the loop. break; } var keyVersionList = new List<KeyVersion>(listVersionsResponse.Versions.Count); for (int index = 0; index < listVersionsResponse.Versions.Count; index++) { keyVersionList.Add(new KeyVersion { Key = listVersionsResponse.Versions[index].Key, VersionId = listVersionsResponse.Versions[index].VersionId }); } try { // Delete the current set of objects. var deleteObjectsResponse = await s3Client.DeleteObjectsAsync(new DeleteObjectsRequest { BucketName = bucketName, Objects = keyVersionList, Quiet = deleteOptions.QuietMode },token).ConfigureAwait(false); if (!deleteOptions.QuietMode) { // If quiet mode is not set, update the client with list of deleted objects. InvokeS3DeleteBucketWithObjectsUpdateCallback( updateCallback, new S3DeleteBucketWithObjectsUpdate { DeletedObjects = deleteObjectsResponse.DeletedObjects } ); } } catch (DeleteObjectsException deleteObjectsException) { if (deleteOptions.ContinueOnError) { // Continue the delete operation if an error was encountered. // Update the client with the list of objects that were deleted and the // list of objects on which the delete failed. InvokeS3DeleteBucketWithObjectsUpdateCallback( updateCallback, new S3DeleteBucketWithObjectsUpdate { DeletedObjects = deleteObjectsException.Response.DeletedObjects, DeleteErrors = deleteObjectsException.Response.DeleteErrors } ); } else { // Re-throw the exception if an error was encountered. throw; } } // Set the markers to get next set of objects from the bucket. listVersionsRequest.KeyMarker = listVersionsResponse.NextKeyMarker; listVersionsRequest.VersionIdMarker = listVersionsResponse.NextVersionIdMarker; } // Continue listing objects and deleting them until the bucket is empty. while (listVersionsResponse.IsTruncated); const int maxRetries = 10; for (int retries = 1; retries <= maxRetries; retries++) { try { // Bucket is empty, delete the bucket. await s3Client.DeleteBucketAsync(new DeleteBucketRequest { BucketName = bucketName },token).ConfigureAwait(false); break; } catch (AmazonS3Exception e) { if (e.StatusCode != HttpStatusCode.Conflict || retries == maxRetries) throw; else DefaultRetryPolicy.WaitBeforeRetry(retries, 5000); } } }
private async static Task DeleteS3BucketWithObjectsAsync(IAmazonS3 s3Client, string bucketName, CancellationToken cancellationToken = new CancellationToken()) { // Validations. if (s3Client == null) { throw new ArgumentNullException("s3Client", "The s3Client cannot be null!"); } if (string.IsNullOrEmpty(bucketName)) { throw new ArgumentNullException("bucketName", "The bucketName cannot be null or empty string!"); } var listVersionsRequest = new ListVersionsRequest { BucketName = bucketName }; ListVersionsResponse listVersionsResponse; string lastRequestId = null; // Iterate through the objects in the bucket and delete them. do { // Check if the operation has been canceled. cancellationToken.ThrowIfCancellationRequested(); // List all the versions of all the objects in the bucket. listVersionsResponse = await s3Client.ListVersionsAsync(listVersionsRequest); // Silverlight uses HTTP caching, so avoid an infinite loop by throwing an exception if (string.Equals(lastRequestId, listVersionsResponse.ResponseMetadata.RequestId, StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException(); } lastRequestId = listVersionsResponse.ResponseMetadata.RequestId; if (listVersionsResponse.Versions.Count == 0) { // If the bucket has no objects break the loop. break; } var keyVersionList = new List <KeyVersion>(listVersionsResponse.Versions.Count); for (int index = 0; index < listVersionsResponse.Versions.Count; index++) { keyVersionList.Add(new KeyVersion { Key = listVersionsResponse.Versions[index].Key, VersionId = listVersionsResponse.Versions[index].VersionId }); } try { // Delete the current set of objects. var deleteObjectsResponse = await s3Client.DeleteObjectsAsync(new DeleteObjectsRequest { BucketName = bucketName, Objects = keyVersionList, Quiet = true }); //if (!deleteOptions.QuietMode) //{ // // If quiet mode is not set, update the client with list of deleted objects. // InvokeS3DeleteBucketWithObjectsUpdateCallback( // updateCallback, // new S3DeleteBucketWithObjectsUpdate // { // DeletedObjects = deleteObjectsResponse.DeletedObjects // } // ); //} } catch //(DeleteObjectsException deleteObjectsException) { //if (deleteOptions.ContinueOnError) //{ // // Continue the delete operation if an error was encountered. // // Update the client with the list of objects that were deleted and the // // list of objects on which the delete failed. // InvokeS3DeleteBucketWithObjectsUpdateCallback( // updateCallback, // new S3DeleteBucketWithObjectsUpdate // { // DeletedObjects = deleteObjectsException.Response.DeletedObjects, // DeleteErrors = deleteObjectsException.Response.DeleteErrors // } // ); //} //else //{ // // Re-throw the exception if an error was encountered. // throw; //} throw; } // Set the markers to get next set of objects from the bucket. listVersionsRequest.KeyMarker = listVersionsResponse.NextKeyMarker; listVersionsRequest.VersionIdMarker = listVersionsResponse.NextVersionIdMarker; } // Continue listing objects and deleting them until the bucket is empty. while (listVersionsResponse.IsTruncated); const int maxRetries = 10; for (int retries = 1; retries <= maxRetries; retries++) { try { // Bucket is empty, delete the bucket. await s3Client.DeleteBucketAsync(new DeleteBucketRequest { BucketName = bucketName }); break; } catch (AmazonS3Exception e) { if (e.StatusCode != HttpStatusCode.Conflict || retries == maxRetries) { throw; } else { DefaultRetryPolicy.WaitBeforeRetry(retries, 5000); } } } //// Signal that the operation is completed. //asyncCancelableResult.SignalWaitHandleOnCompleted(); }
public static DeleteBucketResponse DeleteBucket(this IAmazonS3 client, DeleteBucketRequest request) { return(client.DeleteBucketAsync(request).GetResult()); }
public async Task DeleteBucket(string bucketName) { await _s3Client.DeleteBucketAsync(bucketName); }
public async Task <IActionResult> Delete(string bucketName) { DeleteBucketResponse result = await _s3Client.DeleteBucketAsync(bucketName); return(StatusCode((int)result.HttpStatusCode)); }
public static void DeleteBucketWithObjects(IAmazonS3 s3Client, string bucketName) { // Validations. if (s3Client == null) { throw new ArgumentNullException("s3Client", "The s3Client cannot be null!"); } if (string.IsNullOrEmpty(bucketName)) { throw new ArgumentNullException("bucketName", "The bucketName cannot be null or empty string!"); } var listVersionsRequest = new ListVersionsRequest { BucketName = bucketName }; ListVersionsResponse listVersionsResponse = null; string lastRequestId = null; var exception = new Exception(); var mre = new AutoResetEvent(false); // Iterate through the objects in the bucket and delete them. do { // List all the versions of all the objects in the bucket. s3Client.ListVersionsAsync(listVersionsRequest, (result) => { exception = result.Exception; listVersionsResponse = result.Response; mre.Set(); }, new AsyncOptions() { ExecuteCallbackOnMainThread = false }); mre.WaitOne(); Utils.AssertExceptionIsNull(exception); lastRequestId = listVersionsResponse.ResponseMetadata.RequestId; if (listVersionsResponse.Versions.Count == 0) { // If the bucket has no objects break the loop. break; } var keyVersionList = new List <KeyVersion>(listVersionsResponse.Versions.Count); for (int index = 0; index < listVersionsResponse.Versions.Count; index++) { keyVersionList.Add(new KeyVersion { Key = listVersionsResponse.Versions[index].Key, VersionId = listVersionsResponse.Versions[index].VersionId }); } var deleteObjectsResponse = new DeleteObjectsResponse(); // Delete the current set of objects. s3Client.DeleteObjectsAsync(new DeleteObjectsRequest { BucketName = bucketName, Objects = keyVersionList, Quiet = true }, (result) => { deleteObjectsResponse = result.Response; exception = result.Exception; mre.Set(); }, new AsyncOptions() { ExecuteCallbackOnMainThread = false }); mre.WaitOne(); Utils.AssertExceptionIsNull(exception); // Set the markers to get next set of objects from the bucket. listVersionsRequest.KeyMarker = listVersionsResponse.NextKeyMarker; listVersionsRequest.VersionIdMarker = listVersionsResponse.NextVersionIdMarker; } // Continue listing objects and deleting them until the bucket is empty. while (listVersionsResponse.IsTruncated); // Bucket is empty, delete the bucket. s3Client.DeleteBucketAsync(new DeleteBucketRequest { BucketName = bucketName }, (result) => { exception = result.Exception; mre.Set(); }, new AsyncOptions() { ExecuteCallbackOnMainThread = false }); mre.WaitOne(); Utils.AssertExceptionIsNull(exception); }
public async Task <DeleteBucketResponse> DeleteBucketAsync(string bucketName) { return(await _s3Client .DeleteBucketAsync(bucketName)); }