S3 を使用している他のユーザーに役立つ可能性のある観察と、以下の質問があります。ここでのコード例は、JetS3t Java lib を使用した Groovy のものですが、概念はどのプログラミング言語にも適用できます。
ここ Slashdot や他の場所で、S3 にはバケット内のサブディレクトリの概念がないと主張する多くのドキュメントを見つけました。これはほとんど真実です。ファイルを削除したいときは、最初に以下を使用してそれらを見つけなければならないことがわかります:
//assume we are looking for all files in 'stuff' directory
files = s3.listObjects(bucket, 'stuff/', null)
これらのファイルを削除しても、バケット内のサブディレクトリのように見えるものが残ります。「stuff/」は引き続き表示されます。そのため、サブディレクトリが本当にないというのが本当かどうか疑問に思いました。実際のサブディレクトリがないことは事実ですが、一部のファイルがサブディレクトリになりすましてリストに表示されています。少し調べてみたところ、これは別の S3 オブジェクトであり、キーに特別な文字列 _$folder$ が追加されたキー名を持つことがわかりました。したがって、次のようにしてこれを削除できます(上記の例を想定して):
s3.deleteObject(bucket, 'stuff_$folder$')
これで、そのバケット内のサブディレクトリが一覧表示されなくなります。私はこれをテストしていませんが、キー 'stuff_$folder$' を削除しようとする前に、stuff/ フォルダーが既に空になっている必要があると思います。私が驚いたのは、ここのすべての投稿でこれが言及されていないことです。そのため、サブディレクトリ全体を削除しようとする人は、おそらくサブディレクトリ自体がまだぶらぶらしています!
元の listObjects 呼び出しに戻って、代わりにこれを行うと:
files = s3.listObjects(bucket, 'stuff', null) //note, no trailing slash
結果に stuff_$folder$ が返されます。それに関する私の問題は、キー「stuff」で始まるが「サブディレクトリ」に含まれていない他のオブジェクトも取得する可能性があることです。したがって、注意する必要があります。したがって、私の好みは、「stuff/」をキーとして渡し、「stuff_$folder_」オブジェクトを個別に処理することです。
これは私を最後の質問に導きます。listObjects(bucket, key, delimiter) 呼び出しの最後のパラメーターが何を意味するのかについて明確な説明が得られないようです。「区切り文字」とは正確には何ですか。「ファイル区切り」(「/」など)を意味していないようです。検索しましたが、これが何を意味するか、またはどのように使用されるかを示す例が見つからないようです。listObjects のユーティリティと柔軟性を改善する方法があるかどうかを知りたいです。区切り文字パラメーターの使用法と意味を示す例を誰か提供できますか? それは単純なものだと確信しており、その良い例を見つけることができません。