我想列出所有所谓的folders
和sub-folders
在一个s3
桶中。现在,当我试图列出递归我不使用路径中的所有文件夹withDelimeter()
功能。所有所谓的folder
名称应结束/
,这是我的逻辑列表中的所有文件夹和子文件夹。
这里的scala
代码(不是故意粘贴catch
此代码):
val awsCredentials = new BasicAWSCredentials(awsKey, awsSecretKey)
val client = new AmazonS3Client(awsCredentials)
def listFoldersRecursively(bucketName: String, fullPath: String): List[String] = {
try {
val objects = client.listObjects(bucketName).getObjectSummaries
val listObjectsRequest = new ListObjectsRequest()
.withPrefix(fullPath)
.withBucketName(bucketName)
val folderPaths = client
.listObjects(listObjectsRequest)
.getObjectSummaries()
.map(_.getKey)
folderPaths.filter(_.endsWith("/")).toList
}
}
没有任何明显的模式,很多文件夹,从检索到的文件夹列表中缺少。我没有使用
client.listObjects(listObjectsRequest).getCommonPrefixes.toList
因为它是由于某种原因,返回空列表。
PS:无法在后直接添加,因为作为一个新的用户照片。
没有任何明显的模式,很多文件夹,从检索到的文件夹列表中缺少。
这是你的问题:我们假定你是应该始终在结束键的对象/
,以象征的文件夹。
这是一个不正确的假设。他们只会在那里,如果你创造了他们,无论是通过S3控制台或API。我们没有理由指望他们,因为S3实际上并不需要它们或将其用于任何东西,和S3服务不自发地创建他们自己。
如果您使用API上传与键的对象foo/bar.txt
,这不创建foo/
文件夹作为不同的对象。它会出现在控制台方便的文件夹,但它不存在,除非在某些时候你刻意制造的。
当然,要上传这样的对象与控制台的唯一方法是“创造”的文件夹,除非它已经出现-但会出现在控制台并不一定等同于存在为不同的对象。
在过滤endsWith("/")
无效的逻辑。
这就是为什么底层API包括CommonPrefixes
与如果每个ListObjects响应delimiter
和prefix
指定。这是“文件夹”的一个新的水平,你必须递归下来,以便找到一个新的水平钻入的列表。
如果指定一个前缀,包含前缀和前缀之后,分隔符中第一次出现的相同的字符串的所有键被称为CommonPrefixes一个结果元素进行分组。如果不指定前缀参数,在关键的开头子开始。被所述CommonPrefixes结果元件下分组中的键不是在响应别处返回。
https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html
您需要访问与任何库,您或使用此功能,或者您需要遍历键的完整列表,发现实际常用前缀/
使用字符串分割边界。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句