我有一个观察结果可能会帮助其他使用 S3 的人以及下面的一个问题。此处的示例代码在 Groovy 中使用 JetS3t Java lib,但这些概念适用于任何编程语言。
我在 Slashdot 和其他地方发现了很多文档,声称 S3 在存储桶中没有子目录的概念。这大多是真的。当您要删除文件时,您会发现必须首先使用以下方法找到它们:
//assume we are looking for all files in 'stuff' directory
files = s3.listObjects(bucket, 'stuff/', null)
现在,如果您删除这些文件,您仍然会留下一些看起来非常像存储桶中的子目录的东西。您仍然会看到列出的“东西/”。所以这让我质疑是否真的没有子目录。事实证明确实没有真正的子目录,但是某些文件伪装成子目录并显示在列表中。经过一番探索,我确定这是另一个 S3 对象,其键名带有附加到键的特殊字符串 _$folder$。因此,您可以通过执行以下操作来删除它(假设上面的示例):
s3.deleteObject(bucket, 'stuff_$folder$')
现在,您将不再看到为该存储桶中的内容列出的任何子目录。虽然我没有对此进行测试,但我认为在尝试删除密钥“stuff_$folder$”之前,东西/文件夹必须已经为空。令我吃惊的是,在这里的所有帖子中都没有提到这一点,因此任何试图删除整个子目录的人都可能让子目录本身仍然存在!
如果你回到我原来的 listObjects 调用并改为这样做:
files = s3.listObjects(bucket, 'stuff', null) //note, no trailing slash
您将看到结果中返回的 stuff_$folder$。我的问题是您可能还会获得其他以“stuff”键开头但不包含在“子目录”中的对象。所以你必须小心。所以我的偏好是将“stuff/”作为键传递,然后分别处理“stuff_$folder_”对象。
这引出了最后一个问题。我似乎无法清楚地解释 listObjects(bucket, key, delimiter) 调用中的最终参数的含义。究竟什么是“分隔符”。它似乎并不意味着“文件分隔符”(如'/')。我已经搜索过,似乎找不到一个例子来说明这意味着什么或它是如何使用的。我想知道,因为是否有任何方法可以提高我想知道的 listObjects 的实用性和灵活性。有人可以提供一个示例来说明 delimiter 参数的用法和含义吗?我确定它很简单,但我找不到一个很好的例子。