예제 #1
0
        public static async Task <DeleteObjectsResponse> DeleteObjectsModifiedBeforeDateAsync(this S3Helper s3,
                                                                                              string bucketName,
                                                                                              string prefix,
                                                                                              DateTime dt,
                                                                                              bool throwIfNotFound,
                                                                                              CancellationToken cancellationToken = default(CancellationToken))
        {
            var list = await s3.ListObjectsAsync(bucketName : bucketName, prefix : prefix, cancellationToken : cancellationToken);

            var toDelete = list.Where(x => x.LastModified.Ticks < dt.Ticks).Select(x => new KeyVersion()
            {
                Key = x.Key,
            }).ToArray();

            if (toDelete.IsNullOrEmpty())
            {
                if (throwIfNotFound)
                {
                    throw new Exception($"Found {list?.Length ?? 0} objects with prefix {prefix} in bucket {bucketName}, but none were marked for deletion.");
                }
                else
                {
                    return(null);
                }
            }

            var deleted = await s3.DeleteObjectsAsync(bucketName : bucketName, objects : toDelete, cancellationToken : cancellationToken);

            if (!deleted.DeleteErrors.IsNullOrEmpty())
            {
                throw new Exception($"Deleted {deleted.DeletedObjects.Count} objects, but failed {deleted.DeleteErrors.Count}, due to following errors: {deleted.DeleteErrors.JsonSerialize()}");
            }

            return(deleted);
        }
예제 #2
0
        public static async Task <bool> DeleteVersionedObjectAsync(this S3Helper s3,
                                                                   string bucketName,
                                                                   string key,
                                                                   bool throwOnFailure = true,
                                                                   CancellationToken cancellationToken = default(CancellationToken))
        {
            var versions = await s3.ListVersionsAsync(
                bucketName : bucketName,
                prefix : key,
                cancellationToken : cancellationToken);

            var keyVersions = versions
                              .Where(v => !v.IsLatest)
                              .Select(ver => new KeyVersion()
            {
                Key = key, VersionId = ver.VersionId
            })
                              .ToArray();

            if (keyVersions.Length > 0)
            {
                var response = await s3.DeleteObjectsAsync(
                    bucketName : bucketName,
                    objects : keyVersions,
                    cancellationToken : cancellationToken);

                if (response.DeleteErrors.Count > 0)
                {
                    if (throwOnFailure)
                    {
                        throw new Exception($"Failed to delete all object versions of key '{key}' in bucket '{bucketName}', {response.DeletedObjects.Count} Deleted {response.DeleteErrors.Count} Errors, Delete Errors: {response.DeleteErrors.JsonSerialize(Newtonsoft.Json.Formatting.Indented)}");
                    }
                    else
                    {
                        return(false);
                    }
                }

                return(await s3.DeleteVersionedObjectAsync(bucketName, key, throwOnFailure, cancellationToken));
            }

            try
            {
                var latest = versions.Single(x => x.IsLatest);
                await s3.DeleteObjectAsync(bucketName : bucketName, key : key, versionId : latest.VersionId, cancellationToken : cancellationToken);

                return(true);
            }
            catch
            {
                if (!await s3.ObjectExistsAsync(bucketName, key, cancellationToken))
                {
                    return(true);
                }

                if (throwOnFailure)
                {
                    throw;
                }
                else
                {
                    return(false);
                }
            }
        }