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

  • 存储桶名称/
  • 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)
        {
            /* ... */
        }
    }
    

    最佳答案

    我遇到了相反的问题(我知道如何获取指定文件夹中的文件,而不是子目录中的文件)。

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

    如您的示例所示,子文件夹在 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博客上的评论部分中显示了此信息:

    10-06 14:18
    查看更多