2013-07-10 15 views
16

Ich habe eine Hierarchie in S3 über die AWS S3 Management Console erstellt. Wenn ich den folgenden Code ausführen, um die Eimer zur Liste:Amazon S3 Auflistung "Verzeichnisse"

AmazonS3 s3 = new AmazonS3Client(CRED); 
ListObjectsRequest lor = new ListObjectsRequest() 
          .withBucketName("myBucket") 
          .withPrefix("code/"); 
ObjectListing objectListing = s3.listObjects(lor); 
for (S3ObjectSummary summary: objectListing.getObjectSummaries()) { 
    System.out.println(summary.getKey()); 
} 

ich:

code/ 
code/03000000-0001-0000-0000-000000000000/ 
code/03000000-0001-0000-0000-000000000000/special.js 
code/03000000-0001-0000-0000-000000000000/test.js 
code/03000000-0002-0000-0000-000000000000/ 

das ist genau das, was ich erwarten würde. Wenn ich aber ein Trennzeichen hinzufüge, so dass ich den Inhalt nur direkt unter "code /" aufliste, bekomme ich jetzt keine Unterverzeichnisse zurück.

Ändern Sie Zeile oben (add withDelimiter() am Ende) zu:

ListObjectsRequest lor = new ListObjectsRequest().withBucketName("myBucket") 
               .withPrefix("code/") 
               .withDelimiter("/"); 

Und ich bekomme jetzt nur:

code/ 

Ich weiß, dass S3 nicht über "Verzeichnisse", stattdessen abgegrenzte Schlüssel, aber dieses Verhalten scheint seltsam? Wie würde ich aufführen, was direkt unter "Code" steht?

+0

hast du versucht 'mitPrefix (" code ")' (den Schrägstrich weglassen) – Thilo

+0

Ja, das bringt mir nichts. Pro AWS-Doco müssen Sie das nachgestellte Trennzeichen an das Präfix anhängen. – Kong

+1

Diese Antwort ist vollständiger http://stackoverflow.com/questions/14653694/listing-just-the-sub-folders-in-an-s3-bucket – samthebest

Antwort

19

Wo Sie Schlüssel haben, die keinen Inhalt S3 hält sie für "Common-Präfixe" haben:

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectListing.html#getCommonPrefixes%28%29

public List getCommonPrefixes()

Rufen die gemeinsamen Präfixe in diesem Objekt Auflistung enthalten. Gemeinsame Präfixe sind nur vorhanden, wenn ein Delimiter in der ursprünglichen Anfrage angegeben wurde.

Jedes gemeinsame Präfix stellt eine Gruppe von Schlüsseln im S3-Bucket dar, für die in den Ergebnissen der Objektzusammenfassung zusammengefasst und weggelassen wurde. Diese ermöglicht Anwendungen, ihre Schlüssel hierarchisch zu organisieren und zu durchsuchen, ähnlich wie ein Dateisystem Dateien in Verzeichnissen organisiert.

Betrachten wir zum Beispiel einen Eimer, der folgende Schlüssel enthält:

"foo/bar/Baz"
"foo/bar/bash"
"foo/bar/bang"
„foo/Boo“

Wenn Listobjects mit dem Präfix = calling "foo /" und das Begrenzungszeichen = "/" auf diese Eimer, der zurück S3ObjectListing die gemeinsame Präfixe Liste in einen Eintrag enthalten ("foo/bar /") und keiner der Schlüssel beginnt mit diesem gemeinsamen Präfix wird in die Objektübersichtsliste aufgenommen werden.

Rückgabe: Die Liste der gemeinsamen Präfixe in dieser Objektliste, , die eine leere Liste sein könnte, wenn keine gemeinsamen Präfixe gefunden wurden.

+2

Bitte können Sie Codebeispiel bereitstellen. – samthebest

+0

Es gibt foo /, foo/boo zurück und hat foo/bar in gemeinsamen Präfixen. Ist das korrekt? –

+0

Es gibt ein Beispiel ist diese Antwort: http://stackoverflow.com/questions/14653694/listing-just-the-sub-folders-in-an-s3-bucket –