首页 > 解决方案 > 具有相同名称aws s3的文件和文件夹之间的区别

问题描述

我似乎不明白这是如何工作的。

假设我有以下结构:

s3:/bucket1/file1
s3:/bucket1/file2
s3:/bucket1/dir1/file3
s3:/bucket1/dir1/file4

现在,当我想列出所有内容(包括“目录”,例如 dir1)时,我可以这样做:

    ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName("bucket1")
            .withPrefix("")
            .withDelimiter("/");

    return awsS3Client.listObjects(listObjectsRequest);

这里 Objectsummaries 包含 file1 和 file2,公共前缀包含 dir1

并列出 /bucket1/dir1 的内容,我可以这样做

    ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName("bucket1")
            .withPrefix("dir1/")
            .withDelimiter("/");

    return awsS3Client.listObjects(listObjectsRequest);

现在,如果我想检查某个文件夹是否存在,我可以这样做:

    ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName("bucket1")
            .withPrefix("dir1/")
            .withDelimiter("/");

    return awsS3Client.listObjects(listObjectsRequest).getObjectSummiaries().size() > 0;

在这里,我检查是否找到了一个对象。

我想检查是否存在某些文件:

    ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
            .withBucketName("bucket1")
            .withPrefix("file1")
            .withDelimiter("/");
    return awsS3Client.listObjects(listObjectRequest).getObjectSummaries().size() == 1

但我的问题是,为了模拟目录,我们将内容为空的对象放入其中,并在末尾添加“/”,这意味着我可以拥有同名的文件和目录。在那种情况下,我将如何区分它?

标签: javaamazon-web-servicesamazon-s3

解决方案


您不能有多个具有相同键的对象。

这意味着您使用给定密钥添加的最新内容将获胜。不可能混淆同名的“文件夹”和“文件”。

实际上,S3 中没有文件夹的概念,控制台只是因为文件系统的工作方式而给我们的印象。最好将 S3 视为键/值对数据库。


推荐阅读