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); }
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); } } }