如何使用boto3检查S3密钥是否为空?

时间:2016-10-30 09:50:34

标签: python amazon-s3 boto3

S3本身不支持文件夹,但可以使用空键模拟它们。所以我可以通过创建一个键而不是设置一个值来创建一个新文件夹:

bucket.new_key('directory')

我想确定这样的密钥是目录还是文件。我认为这可以通过检查密钥的内容是否为空来完成,但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:2)

  

S3本身不支持文件夹,但可以使用空键模拟它们。

只有在非常有限的范围内才能正确。

密钥引用0字节(空)对象的事实只是副作用。重要因素是密钥名称以/结尾。

  

以尾随" /"命名的对象显示为Amazon S3控制台中的文件夹。

     

http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

所以,你的测试很简单:如果密钥以/结尾,那就是假装文件夹占位符。

普通对象可以是空的(只是一个"空文件,"例如记录操作的输出,什么都没有报告),所以空虚不是一个有效的测试。

但这到底对你有什么用呢?

  

他们可以被模仿

以上内容仅与S3控制台有关。

  • 通过创建这样一个对象,你唯一能做的就是给控制台一个要显示的文件夹的图片,这样你就可以点击它来把文件放到那里,但是

  • 如果已经存在具有相同前缀的对象,则控制台已经在那里显示了一个文件夹,并且

  • 您可以在不首先创建pics/funny/cat.jpgpics/的情况下以编程方式创建对象pics/funny/,S3会将它们与您创建文件夹占位符的方式区别对待,并且

  • 删除这样的对象并不会删除"内容" "文件夹" (所以这不是"仿效"在这个意义上的文件夹),

  • 删除此类对象并不会从控制台中删除文件夹图标,除非该存储桶中没有其他对象具有该前缀。

您不需要这些占位符对象来处理存储桶中的对象,就好像它们是分层的一样。

列表对象请求API允许您指定prefix,例如myfolder/,以获取myfolder/中所有对象的列表,包括子文件夹中的所有对象,或者,如果您指定delimiter的{​​{1}},则您只会收到该文件夹​​中的对象,而不会收到子文件夹中的对象。

这些API操作不需要创建这些特殊对象。

S3不支持实际文件夹,因为S3中没有任何内容存储"内部"或""""别的。这是为了扩展性。但是,S3支持逻辑文件夹,使用内置于API的/处理逻辑。