如何删除存储桶中某个对象的所有 "children"?

How do I delete all "children" of an object in my bucket?

假设 S3 上我的存储桶中存在以下文件

mybucket/folder1/folder2/myfile.txt
mybucket/folder1/folder2/myfile2.txt
mybucket/folder1/folder4/myfile3.txt

我想做的是删除 mybucket/folder1/folder2/ 下的所有文件,而实际上并不知道那里到底有哪些文件。我知道文件夹不是真实的,实际上是对象键,但我仍然需要实现这种效果。

我试过删除 mybucket/folder1/folder2/(带和不带尾部斜线),但似乎没有发生任何事情;什么都没有被删除。没有错误,HttpResponse 为 204。

我已经有一段时间没有接触 AmazonS3 服务了,但这是你应该做的:

  1. list all object keys在你想要的路径
  2. 每个键,issue a delete action get all keys and delete them in one go

在代码中它应该是这样的(建议示例的粗略编译):

static IAmazonS3 client;


static void DeleteFolderContents(string bucketName, string folderPath) 
{
    using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
    {
        var allKeys = GetFolderContents(bucketName, fodlerPath);       
        var allDeletes = DeleteAllKeys(bucketName, allKeys);

        // allDeletes has # of deleted objects
    }
}

// using DeleteObjectsRequest (all keys at once)
static int DeleteAllKeys(string bucketName, List<string> allKeys) 
{
    var multiObjectDeleteRequest = new DeleteObjectsRequest();
    multiObjectDeleteRequest.BucketName = bucketName;

    foreach(var key in allKeys)
        multiObjectDeleteRequest.AddKey(key, null); // version ID is null

    try
    {
        var response = client.DeleteObjects(multiObjectDeleteRequest);
        return response.DeletedObjects.Count;
    }
    catch (DeleteObjectsException e)
    {
        // throw exception.
    }

    return 0;
}

// delete one by one
static void DeleteKey(string bucketName, string keyName) 
{
    DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest
    {
        BucketName = bucketName,
        Key = keyName
    };
    try
    {
        client.DeleteObject(deleteObjectRequest);
    }
    catch (AmazonS3Exception s3Exception)
    {
        // throw
    }
}

// list all keys for a given path
static List<string> 
    GetFolderContents(string bucketName, string folderPath)
{
    var r = new List<string>();

    try
    {
        ListObjectsRequest request = new ListObjectsRequest
        {
            BucketName = bucketName,
            Prefix = folderPath,
            MaxKeys = 100
        };

        do
        {
            ListObjectsResponse response = client.ListObjects(request);

            foreach (S3Object entry in response.S3Objects)
                r.Add(entry.Key);

            // If response is truncated, set the marker to get the next 
            // set of keys.
            if (response.IsTruncated)
                request.Marker = response.NextMarker;
            else
                request = null;
        } while (request != null);
    }
    catch (AmazonS3Exception amazonS3Exception)
    {
        // throw error
    }
}

您还可以通过 looking at this article 找到一种监听文件夹中所有按键的方法。


已编辑:添加了一个单一操作调用以使用 DeleteObjectsRequest 对象删除所有键。