我正在使用.Net Core和Amazon的.net sdk来从S3中推送和提取内容。我在S3中使用的文件夹结构涉及插入具有几个子目录的空目录。
稍后,我将文件插入这些目录中并四处移动。现在,我需要能够完全删除目录。
我可以使用
删除目录的所有内容 await client.DeleteObjectAsync(bucketName, keyName, null).ConfigureAwait(false);
我在其中循环浏览要删除给定存储桶中的所有文件。但是,它始终使我处于空文件夹结构中,在S3中,我看到它的内容为0字节,但是我不想通过整理成千上万个空文件夹来查找实际具有数据的文件夹。>
是否可以使用AWS .NET SDK从S3删除空文件夹?
更新:
我可以删除所需文件夹中的所有内容,但文件夹本身除外。
using (IAmazonS3 client = new AmazonS3Client(awsCreds, Amazon.RegionEndpoint.USEast1))
{
try
{
DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest();
ListObjectsRequest listRequest = new ListObjectsRequest
{
BucketName = bucketName,
Prefix = prefix,
//Marker = prefix,
};
ListObjectsResponse response = await client.ListObjectsAsync(listRequest).ConfigureAwait(false);
// Process response
foreach (S3Object entry in response.S3Objects)
{
deleteRequest.AddKey(entry.Key);
}
deleteRequest.BucketName = bucketName;
var response2 = await client.DeleteObjectsAsync(deleteRequest).ConfigureAwait(false);
return true;
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null
&& (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId", StringComparison.Ordinal)
|| amazonS3Exception.ErrorCode.Equals("InvalidSecurity", StringComparison.Ordinal)))
{
logger.LogError("AwsS3Service.DeleteFileFromBucket Error - Check the provided AWS Credentials.");
}
else
{
logger.LogError($"AwsS3Service.DeleteFileFromBucket Error - Message: {amazonS3Exception.Message}");
}
}
}
这将删除我选择的目录的所有内容以及所有子目录。但是主目录仍然存在,有什么办法可以删除该主目录。
答案 0 :(得分:0)
您的代码是在那里的99%。您唯一需要做的就是将prefix
变量添加到要删除的键中。从技术上讲,它是一个0字节的对象,也需要“删除”。
例如,在响应中循环访问所有对象之后,继续并添加添加的prefix
变量以查找所有这些内容。
foreach (S3Object entry in response.S3Objects)
{
deleteRequest.AddKey(entry.Key);
}
// Add the folder itself to be deleted as well
deleteRequest.AddKey(prefix);