2012-03-30 34 views
7

Tôi đang cố gắng xác định xem một thư mục có tồn tại trên Amazon S3 Bucket của tôi không và nếu tôi không muốn tạo nó.Amazon S3 Tạo thư mục thông qua .NET SDK và thông qua Management Console

Tại thời điểm này tôi có thể tạo thư mục bằng cách sử dụng .NET SDK như sau:

 public void CreateFolder(string bucketName, string folderName) 
    { 
     var folderKey = folderName + "/"; //end the folder name with "/" 

     var request = new PutObjectRequest(); 

     request.WithBucketName(bucketName); 

     request.StorageClass = S3StorageClass.Standard; 
     request.ServerSideEncryptionMethod = ServerSideEncryptionMethod.None; 

     //request.CannedACL = S3CannedACL.BucketOwnerFullControl; 

     request.WithKey(folderKey); 

     request.WithContentBody(string.Empty); 

     S3Response response = m_S3Client.PutObject(request); 

    } 

Bây giờ khi tôi cố gắng để xem nếu thư mục tồn tại sử dụng mã này:

 public bool DoesFolderExist(string key, string bucketName) 
    { 
     try 
     { 
      S3Response response = m_S3Client.GetObjectMetadata(new GetObjectMetadataRequest() 
       .WithBucketName(bucketName) 
       .WithKey(key)); 

      return true; 
     } 
     catch (Amazon.S3.AmazonS3Exception ex) 
     { 
      if (ex.StatusCode == System.Net.HttpStatusCode.NotFound) 
       return false; 

      //status wasn't not found, so throw the exception 
      throw; 
     } 
    } 

Nó không thể tìm thư mục. Điều kỳ lạ là nếu tôi tạo thư mục bằng AWS Management Console, phương thức 'DoesFolderExist' có thể thấy nó.

Tôi không chắc đó có phải là điều ACL/IAM hay không nhưng tôi không chắc chắn cách giải quyết vấn đề này.

Trả lời

10

Mã của bạn thực sự hiệu quả với tôi, nhưng có một vài điều bạn cần phải biết.

Như tôi đã hiểu, Amazon S3 không có khái niệm về các thư mục, nhưng các máy khách cá nhân có thể hiển thị các đối tượng S3 như thể chúng đã làm. Vì vậy, nếu bạn tạo một đối tượng được gọi là A/B, thì máy khách có thể hiển thị nó như thể nó là một đối tượng được gọi là B bên trong một thư mục có tên A. Đây là trực quan và dường như đã trở thành một tiêu chuẩn, nhưng mô phỏng một thư mục trống không xuất hiện để có một tiêu chuẩn.

Ví dụ, tôi đã sử dụng phương pháp của bạn để tạo một thư mục có tên Test, sau đó thực sự kết thúc việc tạo một đối tượng có tên là Test /. Nhưng tôi đã tạo một thư mục có tên Test2 trong AWS Explorer (tức là addon cho Visual Studio) và nó đã tạo ra một đối tượng gọi là Test2/Test2_ $ folder $ (AWS Explorer sẽ hiển thị cả Test và Test2 dưới dạng thư mục)

của những điều này có nghĩa là bạn không cần cần để tạo 'thư mục' trước khi bạn có thể sử dụng nó, điều này có nghĩa là bạn không cần phương thức DoesFolderExist.

Như tôi đã đề cập đến tôi đã cố gắng mã của bạn và nó hoạt động và tìm thư mục thử nghiệm nó tạo ra, nhưng quan trọng phải được tinh chỉnh để tìm ra thư mục được tạo ra bởi AWS Explorer, tức là

DoesFolderExist("Test/"    , bucketName); // Returns true 
DoesFolderExist("Test2/"    , bucketName); // Returns false 
DoesFolderExist("Test2/Test2_$folder$", bucketName); // Returns true 

Vì vậy, nếu bạn làm vẫn muốn có một phương pháp DoesFolderExist, sau đó nó có thể được an toàn hơn để chỉ cần nhìn cho bất kỳ đối tượng bắt đầu bằng folderName + "/", tức là một cái gì đó giống như

ListObjectsRequest request = new ListObjectsRequest(); 
request.BucketName = bucketName ; 
request.WithPrefix(folderName + "/"); 
request.MaxKeys = 1; 

using (ListObjectsResponse response = m_S3Client.ListObjects(request)) 
{ 
    return (response.S3Objects.Count > 0); 
} 
+0

thông tin hữu ích - cảm ơn –

0
 ListObjectsRequest findFolderRequest = new ListObjectsRequest(); 
     findFolderRequest.BucketName = bucketName; 
     findFolderRequest.Prefix = path; 
     ListObjectsResponse findFolderResponse = s3Client.ListObjects(findFolderRequest); 
     Boolean folderExists = findFolderResponse.S3Objects.Any(); 

con đường có thể là một cái gì như "images/40/". Sử dụng mã ở trên có thể kiểm tra xem một thư mục "hình ảnh/40 /" được gọi là dưới dạng thùng có tồn tại hay không.

Nhưng mô hình dữ liệu Amazon S3 không có khái niệm về thư mục. Khi bạn cố gắng sao chép một hình ảnh hoặc tệp vào đường dẫn nhất định, nếu thư mục được gọi chung này không tồn tại, nó sẽ được tạo tự động như một phần của tên khóa của tệp hoặc hình ảnh này. Vì vậy, bạn thực sự không cần phải kiểm tra xem thư mục này có tồn tại hay không.

Thông tin rất quan trọng từ docs.aws.amazon.com: Mô hình dữ liệu Amazon S3 là cấu trúc phẳng: bạn tạo một thùng và thùng lưu trữ các đối tượng. Không có phân cấp của các thư mục con hoặc thư mục con; tuy nhiên, bạn có thể suy ra phân cấp hợp lý bằng cách sử dụng tiền tố tên khóa và dấu phân tách như giao diện điều khiển Amazon S3.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

Các vấn đề liên quan