Как можно без рекурсивного просмотра содержимого каталога с помощью AWS S3 API? - PullRequest
12 голосов
/ 19 января 2012

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

  • имя сегмента /
  • имя_папки / folder1 /
  • имя_папки / folder1 / foobar.txt
  • имя_папки / folder1 / subfolder1 /
  • имя_папки / folder1 / subfolder1 / hello.txt
  • имя_папки / folder1 / subfolder2 /
  • имя_папки / folder1 / subfolder2 / world.txt
  • имя_папки / folder1 / subfolder2 / subsubfolder1 /
  • имя_каталога / folder1 / subfolder2 / subsubfolder1 / file.txt

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

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

  • имя_папки / folder1 / foobar.txt
  • имя_папки / folder1 / subfolder1 /
  • имя_папки / folder1 / subfolder2 /

... и ничего больше.Я не хочу перечислять файлы и каталоги в подкаталогах , я просто хочу перечислить файлы и подкаталоги на уровне 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)
    {
        /* ... */
    }
}

1 Ответ

24 голосов
/ 02 июня 2012

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

Ответ заключается в том, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...