Как нерекурсивно просматривать содержимое каталога с помощью API AWS S3?

Скажем, у меня есть следующие каталоги и файлы в корзине Amazon S3 (файлы выделены полужирным шрифтом):

  • bucketname /
  • имя ведра / папка1 /
  • bucketname / folder1 / foobar.txt
  • имя ведра / папка1 / подпапка1 /
  • bucketname / folder1 / subfolder1 / hello.txt
  • имя ведра / папка1 / подпапка2 /
  • bucketname / folder1 / subfolder2 / world.txt
  • имя корзины / папка1 / подпапка2 / подпапка1 /
  • bucketname / folder1 / subfolder2 / subsubfolder1 / file.txt

Как я могу перечислить все объекты и непосредственные подкаталоги данного каталога с помощью .NET AWS S3 API, не получая рекурсивно все, что находится ниже этого каталога? Другими словами, как я могу «просматривать» содержимое каталога на одном уровне?

Например, представьте, что я хочу просмотреть содержимое bucketname/folder1/. Я бы хотел увидеть следующее:

  • bucketname / folder1 / foobar.txt
  • имя ведра / папка1 / подпапка1 /
  • имя ведра / папка1 / подпапка2 /

...и ничего больше. Я не хочу перечислять файлы и каталоги в подкаталогах, я просто хочу перечислить файлы и подкаталоги на уровне folder1.

Есть ли способ применить фильтры к одному вызову API AWS, чтобы он не возвращал все и заставлял меня вручную анализировать только то, что мне нужно?

Я обнаружил, что этот код позволяет мне получить только непосредственные подкаталоги (как и предполагалось), но я не могу понять, как включить немедленные файлы:

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)
    {
        /* ... */
    }
}

person Michael    schedule 19.01.2012    source источник


Ответы (1)


У меня была противоположная проблема (я знал, как получить файлы в указанной папке, но не в подкаталогах).

Ответ заключается в том, что Amazon перечисляет файлы иначе, чем подпапки.

Подпапки перечислены, как показывает ваш пример, в коллекции 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 /’ и установите разделитель ‘/’. В ответе у вас всегда будет сама папка как элемент с тем же ключом, что и префикс, который вы использовали в запросе, плюс все подпапки в свойстве CommonPrefixes.

person TomB    schedule 02.06.2012