S3本身不支持文件夹,但可以使用空键模拟它们。所以我可以通过创建一个键而不是设置一个值来创建一个新文件夹:
bucket.new_key('directory')
我想确定这样的密钥是目录还是文件。我认为这可以通过检查密钥的内容是否为空来完成,但我无法弄清楚如何。
答案 0 :(得分:2)
S3本身不支持文件夹,但可以使用空键模拟它们。
只有在非常有限的范围内才能正确。
密钥引用0字节(空)对象的事实只是副作用。重要因素是密钥名称以/
结尾。
以尾随" /"命名的对象显示为Amazon S3控制台中的文件夹。
http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html
所以,你的测试很简单:如果密钥以/
结尾,那就是假装文件夹占位符。
普通对象可以是空的(只是一个"空文件,"例如记录操作的输出,什么都没有报告),所以空虚不是一个有效的测试。
但这到底对你有什么用呢?
他们可以被模仿
以上内容仅与S3控制台有关。
通过创建这样一个对象,你唯一能做的就是给控制台一个要显示的文件夹的图片,这样你就可以点击它来把文件放到那里,但是
如果已经存在具有相同前缀的对象,则控制台已经在那里显示了一个文件夹,并且
您可以在不首先创建pics/funny/cat.jpg
和pics/
的情况下以编程方式创建对象pics/funny/
,S3会将它们与您创建文件夹占位符的方式区别对待,并且
删除这样的对象并不会删除"内容" "文件夹" (所以这不是"仿效"在这个意义上的文件夹),
删除此类对象并不会从控制台中删除文件夹图标,除非该存储桶中没有其他对象具有该前缀。
您不需要这些占位符对象来处理存储桶中的对象,就好像它们是分层的一样。
列表对象请求API允许您指定prefix
,例如myfolder/
,以获取myfolder/
中所有对象的列表,包括子文件夹中的所有对象,或者,如果您指定delimiter
的{{1}},则您只会收到该文件夹中的对象,而不会收到子文件夹中的对象。
这些API操作不需要创建这些特殊对象。
S3不支持实际文件夹,因为S3中没有任何内容存储"内部"或""""别的。这是为了扩展性。但是,S3支持逻辑文件夹,使用内置于API的/
处理逻辑。