【问题标题】:Deleting subdirectories from S3 from code, definition of 'delimiter' param, code in Groovy从代码中删除 S3 中的子目录,定义“分隔符”参数,Groovy 中的代码
【发布时间】:2011-11-25 13:25:11
【问题描述】:

我有一个观察结果可能对使用 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 参数的用法和含义吗?我确信它很简单,但我找不到一个很好的例子。

【问题讨论】:

    标签: groovy amazon-s3 cloud jets3t


    【解决方案1】:

    分隔符是一个笨拙的名称。如果您将其视为后缀,则更有意义。来自 S3 文档 - http://aws.amazon.com/releasenotes/Amazon-S3/213 或者如果您喜欢稍微不同的解释 http://www.bucketexplorer.com/documentation/amazon-s3--search-on-objects-in-bucket.html

    共享一个公共前缀的键组,由一个特殊的前缀终止 delimiter 现在可以按该前缀汇总,以便 清单。这允许应用程序分层浏览其密钥, 很像您在文件系统中浏览目录的方式。

    例如,如果您有一个包含以下键的存储桶 (以嵌入式斜线分隔符命名以模拟目录) 照片/2006/index.html 照片/2006/January/img0001.jpg ... 照片/2006/January/img0999.jpg 照片/2006/February/img1000.jpg ... A Prefix="photos/2006/" 和 Delimiter="/" 的列表查询将返回 照片/2006 级别的键和“子目录”(index.html, 一月,二月,...),但不包括任何 .jpg 键在 更深层次。

    所以认为它就足够了。您的分隔符可以是 .html、.jpg 或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2022-11-08
      • 2018-08-07
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2012-12-28
      相关资源
      最近更新 更多