2012-01-19 16 views
12

私はAmazon S3のバケット内の次のディレクトリとファイルがあるとしましょう(ファイルは太字である):AWS S3 APIを使用してディレクトリの内容を非再帰的に参照するにはどうすればよいですか?

  • 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を私は再帰的にそのD以下のすべてのものを得ることなく、.NET AWS S3のAPIを持つすべてのオブジェクトと指定されたディレクトリの即時サブディレクトリを一覧表示することができますどのよう

ディレクトリですか?言い換えれば、ディレクトリの内容を1つのレベルで「ブラウズ」するにはどうすればよいですか?

たとえば、bucketname/folder1/の内容を参照したいとします。

  • bucketname/folder1の/ foobar.txt
  • bucketname/folder1の/ subfolder1/
  • bucketname/folder1の/ subfolder2/

:私は何を見たいのは次のようです。 ..何もありません。 サブディレクトリにファイルとディレクトリを表示したくない場合は、ファイルとサブディレクトリをfolder1レベルにリストします。

すべてを返さないように、1つのAWS API呼び出しにフィルタを適用する方法はありますか?私が必要なものだけを手動で解析するように強制しますか?

私はこのコードは(意図したとおりに)私はちょうど即時のサブディレクトリを取得してみましょうことがわかってきましたが、私はあまりにも即時ファイル含める方法を見つけ出すことはできません。

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

答えて

22

私が持っていたが反対の問題(私は指定されたフォルダでファイルを取得する方法を知っていたが、サブディレクトリではない)。

答えは、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'プロパティのサブフォルダが常に存在します。

関連する問題