【问题标题】:How do I delete all "children" of an object in my bucket?如何删除存储桶中对象的所有“子项”?
【发布时间】:2016-03-30 07:59:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net amazon-web-services amazon-s3 aws-sdk


    【解决方案1】:

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

    1. list all object keys 在你想要的路径中
    2. 对于每个键,issue a delete action 获取所有键和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 对象删除所有键。

    【讨论】:

    • 谢谢,成功了。奇怪的是我可以从“文件夹”中列出,但我不能删除“文件夹”
    • @Sinaesthetic 检查该“文件夹”键的权限
    • 代码更新:添加了一种在一个操作中删除所有键的方法,这样您就可以为每个删除的键保存 API 行程...
    猜你喜欢
    • 2022-10-19
    • 2017-03-20
    • 1970-01-01
    • 2019-08-05
    • 2010-10-16
    • 2018-12-21
    • 2020-06-14
    • 2013-08-23
    • 2021-05-09
    相关资源
    最近更新 更多