使用 S3 DeleteObject 仅删除文件,保持目录结构不变
Delete only files using S3 DeleteObject keeping directory structure intact
我只需要删除 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 目录下的文件?
S3 没有目录结构。这是一个完全扁平的文件系统。名为 foo/bar
的对象只是:名为 foo/bar
的对象,而不是名为 foo
的目录中名为 bar
的对象。如果您删除了 foo/bar
,并且存储桶中没有其他以字符串 foo/
开头的对象,那么看起来 "directory" foo
已被删除,但它从未存在过首先。因此,要再次创建一个名为 foo/bar
的对象,您不需要先创建一个名为 foo/
的目录;只需创建一个名为 foo/bar
.
的对象
S3中的一个"key"类似于一个文件路径:
http://bucket.s3.amazonaws.com/some/path/to/use
...位于名为 bucket 的存储桶中,其键为 some/path/to/use.
虽然它实际上不是路径,因为没有文件夹。 S3 密钥只是一个大目录(整个存储桶)中文件的文件名。 S3键可以包含/,但没有特殊含义。
换句话说,拥有一个名为 some/object 的对象并不会告诉您关于该对象的任何信息(它可能存在也可能不存在——这两个对象不相关)。
但是,您可以请求具有特定前缀的键,所以我可以说 "give me all keys starting with some/path/to/ and it will return some/path/to/use. It looks like "列出目录”,但它实际上只是请求以特定字符串开头的文件。
编辑:
我查看了 JavaDocs,这是我看到的函数签名(对于 AmazonS3Client):
public void deleteObject(java.lang.String bucketName,
java.lang.String key)
throws AmazonClientException,
AmazonServiceException
我只需要删除 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 目录下的文件?
S3 没有目录结构。这是一个完全扁平的文件系统。名为 foo/bar
的对象只是:名为 foo/bar
的对象,而不是名为 foo
的目录中名为 bar
的对象。如果您删除了 foo/bar
,并且存储桶中没有其他以字符串 foo/
开头的对象,那么看起来 "directory" foo
已被删除,但它从未存在过首先。因此,要再次创建一个名为 foo/bar
的对象,您不需要先创建一个名为 foo/
的目录;只需创建一个名为 foo/bar
.
S3中的一个"key"类似于一个文件路径:
http://bucket.s3.amazonaws.com/some/path/to/use ...位于名为 bucket 的存储桶中,其键为 some/path/to/use.
虽然它实际上不是路径,因为没有文件夹。 S3 密钥只是一个大目录(整个存储桶)中文件的文件名。 S3键可以包含/,但没有特殊含义。
换句话说,拥有一个名为 some/object 的对象并不会告诉您关于该对象的任何信息(它可能存在也可能不存在——这两个对象不相关)。
但是,您可以请求具有特定前缀的键,所以我可以说 "give me all keys starting with some/path/to/ and it will return some/path/to/use. It looks like "列出目录”,但它实际上只是请求以特定字符串开头的文件。
编辑:
我查看了 JavaDocs,这是我看到的函数签名(对于 AmazonS3Client):
public void deleteObject(java.lang.String bucketName,
java.lang.String key)
throws AmazonClientException,
AmazonServiceException