2012-01-19 8 views
12

Say mam następujące katalogi i pliki w wiaderku z Amazon S3 (pliki są w pogrubioną):Jak można nierekurencyjnie przeglądać zawartość katalogu za pomocą interfejsu API AWS 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/plik.txt

Jak mogę wymienić wszystkich obiektów i natychmiastowe podkatalogów danego katalogu z .NET API AWS S3, bez rekurencyjnie coraz wszystko poniżej tego d Wizualnie? Innymi słowy, w jaki sposób mogę "przeglądać" zawartość katalogu na jednym poziomie?

Na przykład wyobraź sobie, że chcę przejrzeć zawartość bucketname/folder1/. Co chciałbym zobaczyć to:

  • bucketname/folder1/foobar.txt
  • bucketname/folder1/Subfolder1/
  • bucketname/folder1/subfolder2/

. ..i nic więcej. Nie chcę wyświetlać plików i katalogów w podkatalogach , chcę tylko wyświetlić listę plików i podkatalogów na poziomie folder1.

Czy istnieje sposób zastosowania filtrów do pojedynczego wywołania interfejsu API AWS, aby nie zwracać wszystkiego i zmuszać mnie do ręcznego analizowania tylko tego, czego potrzebuję?

Odkryłem, że ten kod pozwala mi uzyskać tylko natychmiastowe podkatalogów (zgodnie z przeznaczeniem), ale nie mogę dowiedzieć się, jak to natychmiastowe plików TOO:

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

Odpowiedz

22

miałem przeciwny problem (wiedziałem, jak uzyskać pliki w określonym folderze, ale nie w podkatalogach).

Odpowiedź brzmi, że Amazon wyświetla listę plików inaczej niż robi podfoldery.

Podfoldery są wymienione, jak pokazuje Twój przykład, w kolekcji ListObjectsResponse.CommonPrefixes.Pliki są wymienione w kolekcji ListObjectsResponse.S3Objects.

więc kod powinien wyglądać tak:

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 */ 
    } 
} 

moje wyszukiwanie google pojawił się ten post na blogu burningmonk z tym w sekcji Komentarz:

podczas dokonywania żądania ListObjects, aby wyświetlić foldery najwyższego poziomu, nie ustawiaj prefiksu, ale ustaw ogranicznik na "/", a następnie sprawdź właściwość "CommonPrefixes" w odpowiedzi dla folderów znajdujących się w najwyższym folderze.

Aby wyświetlić zawartość "folderu root", należy ustawić dla prefiksu żądanie z nazwą folderu i odwróconym ukośnikiem, np. "Rootfolder /" i ustaw ogranicznik na "/". W odpowiedzi zawsze będziesz mieć ten folder jako element z tym samym kluczem, co prefiks użyty w żądaniu, oraz wszystkie podfoldery we właściwości "CommonPrefixes".

Powiązane problemy