使用S3 DeleteObject仅删除文件,保持目录结构不变

时间:2016-08-09 07:01:26

标签: java amazon-web-services amazon-s3 aws-sdk

我只需要删除Amazon S3中特定目录下的文件, 我的文件路径如下

s3://{s3_bucket}/folder1/sub-folder2/sub-folder3/sub-folder4/sub-folder5/sub-folder6/sub-folder7/sub-folder8/sub-folder9/file.txt

我使用以下代码从上面的目录结构中删除文件

public static void deleteFilesInDirectory(String bucketName, String prefix) {       
        String delimiter = "/";
        if (!prefix.endsWith(delimiter)) {
            prefix += delimiter;
        }
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
                .withBucketName(bucketName).withPrefix(prefix);

        ObjectListing objects = s3client.listObjects(listObjectsRequest);       
        for(S3ObjectSummary summary:objects.getObjectSummaries())
        {
            if(!summary.getKey().endsWith("/"))
            {
            s3client.deleteObject(bucketName, summary.getKey());
            }           
        }      
    }

上面的代码删除了目录sub-folder3 / sub-folder4 / sub-folder5 / sub-folder6 / sub-folder7 / sub-folder8 / sub-folder9 /

但我需要上面的目录结构。

我对api的理解是否正确,有人可以帮助我吗

是否有其他替代方法只使用java删除特定s3目录下的文件?

2 个答案:

答案 0 :(得分:7)

S3没有目录结构。它是一个完全平坦的文件系统。名为foo/bar的对象就是:名为foo/bar的对象,而不是名为bar的目录中名为foo的对象。如果您删除了foo/bar,并且从字符串foo/开始的存储桶中没有其他对象,则它看起来像"目录" foo已被删除,但它从未存在过。因此,要再次创建名为foo/bar的对象,您不需要首先创建名为foo/的目录;只需创建一个名为foo/bar的对象。

答案 1 :(得分:0)

S3中的“键”类似于文件路径:

http://bucket.s3.amazonaws.com/some/path/to/use ...位于名为bucket的存储桶中,并且具有some / path / to / use的键。

它实际上并不是一条路径,因为没有文件夹。 S3密钥只是一个大目录(整个存储桶)中文件的文件名。 S3键可以包含/,但它没有特殊含义。

换句话说,拥有一个名为some / object的对象并没有告诉你任何关于对象的信息(它可能存在也可能不存在 - 两个对象不相关)。

但是,你可以请求具有特定前缀的密钥,所以我可以说“给我所有的密钥以一些/ path / to /开头,它将返回一些/ path / to / use。它看起来像”列出一个目录“,但它实际上只是要求以特定字符串开头的文件。

编辑:

我查看了JavaDocs,这是我看到的函数签名(适用于AmazonS3Client):

public void deleteObject(java.lang.String bucketName,
                     java.lang.String key)
              throws AmazonClientException,
                     AmazonServiceException