2013-04-20 40 views
2

我試圖通過.NET API重命名Azure存儲BLOB,這是我無法重命名的前一天,一個blob文件:(不能在Azure存儲重命名文件的blob

這裏是怎麼了這樣做,從舊創造新斑塊和複製。

var newBlob = blobContainer.GetBlobReferenceFromServer(filename); 

newBlob.StartCopyFromBlob(blob.Uri); 

blob.Delete(); 

沒有在服務器上沒有新斑塊所以我得到HTTP 404未發現異常。

這裏工作的例子,我已經找到,但它是舊的.net存儲API。

CloudBlob blob = container.GetBlobReference(sourceBlobName); 
CloudBlob newBlob = container.GetBlobReference(destBlobName); 
newBlob.UploadByteArray(new byte[] { }); 
newBlob.CopyFromBlob(blob); 
blob.Delete(); 

當前我正在使用2.0 API。我在哪裏犯了一個錯誤?

回答

6

我看到您正在使用GetBlobReferenceFromServer方法來創建新的blob對象的實例。爲了使這個函數起作用,blob必須存在,當你嘗試重命名blob時,情況並非如此。

你可以做的是在舊的BLOB上調用GetBlobReferenceFromServer,獲取它的類型,然後創建一個BlockBlob或PageBlob的實例並對其執行復制操作。所以,你的代碼將是這樣的:

CloudBlobContainer blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference("container"); 
    var blob = blobContainer.GetBlobReferenceFromServer("oldblobname"); 
    ICloudBlob newBlob = null; 
    if (blob is CloudBlockBlob) 
    { 
     newBlob = blobContainer.GetBlockBlobReference("newblobname"); 
    } 
    else 
    { 
     newBlob = blobContainer.GetPageBlobReference("newblobname"); 
    } 
    //Initiate blob copy 
    newBlob.StartCopyFromBlob(blob.Uri); 
    //Now wait in the loop for the copy operation to finish 
    while (true) 
    { 
     newBlob.FetchAttributes(); 
     if (newBlob.CopyState.Status != CopyStatus.Pending) 
     { 
      break; 
     } 
     //Sleep for a second may be 
     System.Threading.Thread.Sleep(1000); 
    } 
    blob.Delete(); 
+0

在新的api中沒有GetBlockReference。新的api提供了GetBlobReferenceFromServer方法。沒有測試你的代碼,我不明白你的代碼如何擺脫http沒有發現異常而複製到none blob。 – Freshblood 2013-04-20 15:14:16

+0

是的,有:http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.blob.cloudblobcontainer.getblockblobreference.aspx。 GetBlobReferenceFromServer用於在不知道前期blob的類型以及blob需要存在的情況下。其實現在我已經更仔細地閱讀了你的問題,我已經編輯了我的答案(抱歉,應該在第一次去仔細閱讀你的問題)。 – 2013-04-20 15:25:36

+0

不過newBlob.StartCopyFromBlob(blob.Uri)行拋出HTTP未發現異常:。((( – Freshblood 2013-04-20 19:42:59

0

在OP的代碼,所不同的異步複製方法被稱爲幾乎罰款。新API中最簡單的代碼應該是:

var oldBlob = cloudBlobClient.GetBlobReferenceFromServer(oldBlobUri); 
var newBlob = container.GetBlobReference("newblobname"); 
newBlog.CopyFromBlob(oldBlob); 
oldBlob.Delete();