2016-08-12 14 views
-2

Amazon S3に複数のファイルが保存されています。私たちは、与えられたルートフォルダファイルとフォルダのすべてのキーを再帰的に印刷すると、正常に動作しません。

ObjectListing listing = s3.listObjects(bucketName, prefix); 
List<S3ObjectSummary> summaries = listing.getObjectSummaries(); 
while (listing.isTruncated()) { 
    listing = s3.listNextBatchOfObjects (listing); 
    summaries.addAll (listing.getObjectSummaries()); 
} 

ためのすべてのファイルとフォルダを反復するために、次のコードを使用している

は、ルートフォルダが1000個のファイルと10個のフォルダを持っていると仮定します。フォルダの1つに100個のサブフォルダがあり、それぞれに500個のファイルがあります。

上記のプログラムは正常に動作し、すべてのファイルを一覧表示し、すべてのファイルをトラバースします。

問題は、すべてのサブフォルダのキーを印刷していないことです。

興味深いのは、それが問題になる可能性がどのような最初のサブフォルダ

Root Folder: Emp 
Folder Under Root folder: FolderA, FolderB, FolderC 
Sub-folder under FolderA: 0, 1, 2, 3, 4, 5 ... 100 
Each 0 or 1 or 2...has 500 files each 

を印刷しているのですか? AWSまたはFolderの制限は数値ではありませんか、または論理的な問題はありますか?

上記のコードを使用した場合。

FolderA/0 /はFolderA/1などのキーとして来ている.... FolderA/10は

感謝を付属していません。

+0

S3にはフォルダのようなものはありません。 Webコンソールから擬似フォルダを作成することができます。実際には、そのキーを持つ空のオブジェクトが作成されます。これはおそらく、期待どおりに機能しているいくつかのフォルダに対して表示されます。 –

+0

はい..すべての空のオブジェクト、つまりサブフォルダの下のフォルダが必要です。 – Kathire

+0

コードはhttp://stackoverflow.com/questions/8027265/how-to-list-all-aws-s3-objects-in-a-bucket-using-javaと同じように見えます。コードをステップ実行して、正しくループしていることを確認します。また、結果を再確認してください:正しいかもしれませんが、間違っていると思います。 –

答えて

1

Amazon S3にはフォルダやディレクトリなどはありません。 Amazon S3はキーデータストアです。フォルダとサブフォルダは、オブジェクトキーの "/"文字を人間が解釈します。 S3はそれらを知らないか気にしません。

"/"文字で終わる0バイトオブジェクトを作成することで、S3で空のフォルダの作成を「偽造」できます。

オブジェクトのリストを反復するとき、これらの0バイトの「フォルダ」が含まれます。

しかし、「folder1/object1」のようなオブジェクトもあります。「folder1」はルートから離れたサブフォルダです。しかし、S3では、 "folder1 /"のようなオブジェクトがないかもしれません。この場合、自分の結果リストに出力された「folder1 /」は表示されません。

すべての "サブフォルダ"のリストを取得する必要がある場合は、 "/"文字で終わるオブジェクトを探すだけでなく、すべてのオブジェクトを調べて "/"オブジェクト自体の0バイトのオブジェクトが存在しない可能性があるため、オブジェクトのキーからサブフォルダを推測します。例えば

  • のfolder1 /オブジェクト1
  • フォルダ2/
  • フォルダ2 /オブジェクト1

この例では、唯一のサブフォルダオブジェクトがありますが、あなたはそこに言うことができます実際には2つのサブフォルダです。

のJavaっぽい擬似コードは、サブフォルダを取得するには:数字と

function getSubFolders(bucketName, currentFolder) 
{ 
    // Use the current folder as the S3 prefix 
    var prefix = currentFolder; 

    // Get all objects 
    ObjectListing listing = s3.listObjects(bucketName, prefix); 
    List<S3ObjectSummary> summaries = listing.getObjectSummaries(); 
    while (listing.isTruncated()) { 
    listing = s3.listNextBatchOfObjects (listing); 
    summaries.addAll (listing.getObjectSummaries()); 
    } 

    // Split the list into files in the current folder and sub-folders 
    List<string> subFolders = new List<string>(); 
    List<string> files = new List<string>(); 
    foreach (var summary in summaries) 
    { 
    var key = summary.key; 

    // The key includes the prefix, so remove it 
    key = key.subString(prefix.length); 

    // If the key includes a/character, then 
    // it's in a subfolder. Just save the subfolder part 
    // of this object. 
    // Otherwise, save the key in our list of files. 
    var slashIndex = key.indexOf("/"); 
    if (slashIndex >= 0) 
    { 
     subFolders.add(key.subString(0, slashIndex)); 
    } 
    else 
    { 
     files.add(key); 
    } 
    } 

    // Remove duplicate entries from our subFolder list 
    subFolders = subFolders.distinct(); 
} 
+0

S3ブラウザや雲母やサイバーダックを参照すると、すべてのフォルダを見ることができます。上記のコードを使用してキーを印刷すると同じことが繰り返されます。フォルダ名は印刷されません。他のブラウザやエクスプローラに表示されているすべての名前が必要なだけで助けてください。 – Kathire

+1

他のプログラムは、既存のオブジェクトキーからサブフォルダを推測しています。私の答えは、まさに私が言っていることです。すべてのオブジェクトを見て、独自のサブフォルダリストを作成する必要があります。 –

+0

Matt House ..コードで実現する方法コードで私を助けてください、または結果を得るために上記を修正してください。 – Kathire

0

フォルダを再帰的に正しく読み込まれていません。

  1. パスの下にあるすべてのフォルダを反復処理を次のように

    は現在、解決しました。

  2. パス内のすべてのファイルを再帰的に反復する。

すべてのファイルとフォルダを再帰的に取得することはできません。しかし、繰り返し処理するときにフォルダを処理することは再帰的にうまく動作します。

これは少し高価な操作だと思われますが、動作します。

関連する問題