Подтвердить что ты не робот

Как я не рекурсивно просматриваю содержимое каталога с помощью API AWS 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.

Есть ли способ применить фильтры к одному вызову 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)
    {
        /* ... */
    }
}
4b9b3361

Ответ 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 на ответ для папок, находящихся в верхней папке.

Чтобы перечислить содержимое корневой папки, сделайте запрос с префиксом установленным на имя папки плюс обратную косую черту, например. 'Корневой каталог/и установите разделитель на'/. В ответе у вас всегда будет папка как элемент с тем же ключом, что и префикс, который вы использовали в запросе, плюс любые подпапки в свойстве CommonPrefixes.