我只需要删除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目录下的文件?
答案 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