如何使用AWS S3 API非递归地浏览目录的内容?

时间:2012-01-19 19:59:27

标签: c# .net amazon-s3

假设我在Amazon S3存储桶中有以下目录和文件(文件为粗体):

  • bucketname /
  • bucketname / folder1中/
  • bucketname / folder1中/的 foobar.txt
  • bucketname / folder1中/ subfolder1 /
  • bucketname / folder1中/ subfolder1 /的 hello.txt的
  • bucketname / folder1中/ subfolder2 /
  • bucketname / folder1中/ subfolder2 /的 world.txt
  • bucketname / folder1中/ subfolder2 / subsubfolder1 /
  • bucketname / folder1中/ subfolder2 / subsubfolder1 /的 file.txt的

如何使用.NET AWS S3 API列出给定目录的所有对象和直接子目录,而不递归获取该目录下的所有内容?换句话说,我如何在一个级别“浏览”目录的内容?

例如,想象一下我想要浏览bucketname/folder1/的内容。我想看到的是:

  • bucketname / folder1中/的 foobar.txt
  • bucketname / folder1中/ subfolder1 /
  • bucketname / folder1中/ subfolder2 /

......别无其他。我不想列出子目录中的文件和目录,我只想列出folder1级别的文件和子目录。

有没有办法将过滤器应用于单个AWS API调用,以便它不会返回所有内容,并强制我手动解析我需要的内容?

我发现这段代码让我只获得了直接的子目录(如预期的那样),但我也无法弄清楚如何包含直接的文件

var request = new ListObjectsRequest()
    .WithBucketName("bucketname")
    .WithPrefix(@"folder1/")
    .WithDelimiter(@"/");

using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
using (var response = client.ListObjects(request))
{
    foreach (var item in response.CommonPrefixes)
    {
        /* ... */
    }
}

1 个答案:

答案 0 :(得分:24)

我有相反的问题(我知道如何获取指定文件夹中的文件,但不知道子目录)。

答案是,亚马逊列出的文件与子文件夹不同。

ListObjectsResponse.CommonPrefixes 集合中列出了子文件夹,如您的示例所示。

文件列在 ListObjectsResponse.S3Objects 集合中。

所以你的代码应该是这样的:

var request = new ListObjectsRequest()
.WithBucketName("bucketname")
.WithPrefix(@"folder1/")
.WithDelimiter(@"/");

using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
using (var response = client.ListObjects(request))
{
    foreach (var subFolder in response.CommonPrefixes)
    {
        /* list the sub-folders */
    }
    foreach (var file in response.S3Objects) {
         /* list the files */
    }
}

我的Google搜索在burningmonk博客上发布了这篇帖子,并在评论部分显示:

  

当您发出ListObjects请求时,要列出顶级文件夹,请不要设置前缀,而是将分隔符设置为“/”,然后检查响应中的“CommonPrefixes”属性,以查找顶部的文件夹文件夹中。

     

要列出“rootfolder”的内容,请将前缀设置为文件夹名称加上反斜杠的请求生成,例如: 'rootfolder /'并将分隔符设置为'/'。在响应中,您始终将文件夹本身作为一个元素,其元素与您在请求中使用的前缀相同,以及“CommonPrefixes”属性中的任何子文件夹。