AWS S3 - ListObjects返回不完整的目录列表

时间:2015-11-06 11:01:13

标签: c# amazon-web-services amazon-s3 aws-sdk

我使用没有任何分隔符的ListObject函数,因此我有一些看起来像:

/BF
/BF/FTP
/BF/MUSIC/LIBRARY/AUDITION/BEAKING%20EARLY.MP3
/BF/VIDEO/
/BF/VIDEO/Example
/BF/VIDEO/Example/test.mp4

音乐文件夹中的问题。为什么ListObjects不返回带有键的S3Object:“/ BF / MUSIC”。有许多具有相同问题的S3Object。为什么会这样?

2 个答案:

答案 0 :(得分:3)

原因是S3实际上具有扁平结构。没有文件夹,但它只识别正斜杠,因此将具有相同前缀的文件分组在同一文件夹下。所以在你的例子中,“/ BF / MUSIC”只是另一个对象,而不是一个空文件夹。

  

在Amazon S3中,存储桶和对象是主要资源,其中   对象存储在存储桶中。亚马逊S3的结构扁平,没有   您将在典型的文件系统中看到的层次结构。但是,对于   为了简化组织,Amazon S3控制台支持   文件夹概念作为分组对象的一种手段。 Amazon S3就是这么做的   通过使用对象的密钥名称前缀。

来源:AWS Documentation: Working with Folders

答案 1 :(得分:1)

在尝试使用 AWS SDK ListObjectsListObjectV2 同步 S3 存储桶中的文件夹和文件时,我也遇到了类似的问题。

就我而言,原因与文件上传过程有关。 例如,当我创建一个文件夹并将文件上传到该创建的文件夹时,我能够接收两个对象(文件夹和文件)。

/createdFolder
/createdFoder/example.pdf

但是当我使用 AWS SDK PutObject 上传文件并训练将文件上传到不存在的目录时,例如使用密钥

/createdFoder/folder1/folder2/example.pdf

上传后,我在训练获取对象列表时看不到以下对象

/createdFoder/folder1
/createdFoder/folder1/folder2

它只返回 /createdFoder/folder1/folder2/example.pdf

作为我的解决方案,我添加了验证并使用 HeadObject 检查文件夹是否存在。如果返回 404 状态,则表示该文件夹不存在。

<块引用>

重要提示:如果您使用 HeadObject,Key 参数的最后一个 / 是必需的。例如,键看起来像 /createdFoder/folder1/

而且我还添加了添加文件夹的功能。使用相同的 PutObject 但不提供缓冲区,并使用 Key 之类的东西

/createdFolder/newFolder/

当使用上述提供的方式创建文件夹时,ListObjects 将对象作为单独的对象返回。