public static async IAsyncEnumerable <S3DeleteError> DeleteAllObjectVersionsAsync(this IObjectClient client, string bucketName, string?prefix = null, [EnumeratorCancellation] CancellationToken token = default)
        {
            Validator.RequireNotNull(client, nameof(client));
            Validator.RequireNotNullOrEmpty(bucketName, nameof(bucketName));

            ListObjectVersionsResponse        response;
            Task <ListObjectVersionsResponse> responseTask = client.ListObjectVersionsAsync(bucketName, req => req.Prefix = prefix, token);

            do
            {
                if (token.IsCancellationRequested)
                {
                    break;
                }

                response = await responseTask;

                if (!response.IsSuccess)
                {
                    throw new S3RequestException(response, $"Unable to list objects in bucket '{bucketName}");
                }

                if (response.Versions.Count + response.DeleteMarkers.Count == 0)
                {
                    yield break;
                }

                if (response.IsTruncated)
                {
                    string keyMarker = response.NextKeyMarker;
                    responseTask = client.ListObjectVersionsAsync(bucketName, req =>
                    {
                        req.Prefix    = prefix;
                        req.KeyMarker = keyMarker;
                    }, token);
                }

                IEnumerable <S3DeleteInfo> delete = response.Versions.Select(x => new S3DeleteInfo(x.ObjectKey, x.VersionId))
                                                    .Concat(response.DeleteMarkers.Select(x => new S3DeleteInfo(x.ObjectKey, x.VersionId)));

                DeleteObjectsResponse multiDelResponse = await client.DeleteObjectsAsync(bucketName, delete, req => req.Quiet = false, token).ConfigureAwait(false);

                if (!multiDelResponse.IsSuccess)
                {
                    throw new S3RequestException(response, $"Unable to delete objects in bucket '{bucketName}");
                }

                foreach (S3DeleteError error in multiDelResponse.Errors)
                {
                    yield return(error);
                }
            } while (response.IsTruncated);
        }
Exemple #2
0
 public Task <ListObjectVersionsResponse> ListObjectVersionsAsync(string bucketName, Action <ListObjectVersionsRequest>?config = null, CancellationToken token = default)
 {
     return(_objectClient.ListObjectVersionsAsync(bucketName, config, token));
 }