2012-03-30 76 views
7

我試圖確定一個文件夾是否存在於我的Amazon S3存儲桶中,並且它不是我想要創建的。Amazon S3通過.NET SDK創建文件夾vs通過管理控制檯

此刻,我可以使用.NET SDK創建如下文件夾:

 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); 

    } 

現在,當我嘗試看看是否存在該文件夾使用此代碼:

 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; 
     } 
    } 

這不可能找到該文件夾​​。奇怪的是,如果我使用AWS管理控制檯創建文件夾,'DoesFolderExist'方法可以看到它。

我不確定它是一個ACL/IAM的東西,但不知道如何解決這個問題。

回答

10

你的代碼實際上適用於我,但有幾件事你需要注意。

據我所知,Amazon S3沒有文件夾的概念,但單個客戶端可能會像顯示S3對象一樣顯示文件夾。所以如果你創建一個名爲A/B的對象,那麼客戶端可能會顯示它,就好像它是一個名爲B的對象,它位於名爲A的文件夾內。這很直觀,似乎已經成爲標準,但是不會顯示模擬空文件夾有一個標準。

例如,我用你的方法創建一個名爲Test的文件夾,然後最終創建一個名爲Test /的對象。但我在AWS Explorer中創建了名爲Test2的文件夾(即Visual Studio的插件),並最終創建了一個名爲Test2/Test2_ $文件夾的對象$ (AWS Explorer將同時顯示Test和Test2作爲文件夾)

Once這意味着你不需要需要來創建「文件夾」,然後才能使用它,這可能意味着你不需要一個DoesFolderExist方法。

正如我提到我想你的代碼,它的工作原理,並發現它創建的測試文件夾,但關鍵不得不進行調整以找到AWS資源管理器中創建的文件夾,即

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

所以,如果你這樣做還是希望有一個DoesFolderExist方法,那麼它可能會更安全,只是尋找一個與文件夾名稱+「/」開頭的任何對象,即像

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

有用的信息 - 謝謝 – 2013-07-24 08:45:48

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

路徑可以是像「圖像/ 40 /」。 使用上面的代碼可以檢查桶中是否存在所謂的「images/40 /」文件夾。

但是Amazon S3數據模型沒有文件夾的概念。當您嘗試將圖像或文件複製到特定路徑時,如果此共存文件夾不存在,它將作爲此文件或圖像的密鑰名稱的一部分自動創建。因此,您實際上不需要檢查該文件夾是否存在。

來自docs.aws.amazon.com的非常重要的信息:Amazon S3數據模型是一個扁平結構:您創建一個存儲桶並且該存儲桶存儲對象。沒有子包或子文件夾的層次結構;但是,您可以使用密鑰名稱前綴和分隔符來推斷邏輯層次結構,如Amazon S3控制檯所做的那樣。

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