2 回答
TA贡献1798条经验 获得超7个赞
Amazon S3 实际上没有文件夹/目录。
例如,您可以运行以下命令:
aws s3 cp foo.txt s3://my-bucket/a/b/c/foo.txt
即使路径a/b/c
不存在,这也有效。
然后,如果该对象随后被删除,则路径消失。
这是因为每个对象的文件名 ('Key') 是完整路径。Amazon S3 使它“看起来”有目录,但实际上没有。
那么,当你创建一个文件夹时会发生什么?答案是系统创建了一个与路径同名的零长度对象。
在您的情况下,有一个零长度对象称为/a/b/c/f/
. 这使目录出现(即使没有目录这样的东西)。
虽然a/b/c/f/
可能不包含对象,但有一个名为a/b/c/f/
.
如何解决这个问题?以下是一些选项:
不要创建目录。通过在给定路径中创建对象,让它们自动“出现”。这样,就不会出现目录名称的零长度文件。
更改您的代码以忽略零长度对象。
TA贡献1840条经验 获得超5个赞
我做了以下代码更改,现在我得到了正确的计数
val reqAws:ListObjectsV2Request = new ListObjectsV2Request().withBucketName(awsBucketName).withPrefix(prefixForAws);
var resultAws:ListObjectsV2Result = null;
var totalFilesInAws:Int = 0;
do {
resultAws = awsS3Client.listObjectsV2(reqAws);
val summariesForAws:java.util.List[S3ObjectSummary] = resultAws.getObjectSummaries()
for(k <- summariesForAws.asScala) {
if(!(k.getKey.toString().endsWith("/"))) {
totalFilesInAws+= 1;
}
}
val token:String = resultAws.getNextContinuationToken();
reqAws.setContinuationToken(token);
} while (resultAws.isTruncated());
添加回答
举报