无法在Azure存储中重命名blob文件

时间:2013-04-20 14:38:03

标签: azure azure-storage-blobs

我正在尝试通过.net API在Azure存储中重命名blob,而且我无法在一天后重命名blob文件:(

通过创建新的blob和旧版本的副本,我就是这样做的。

var newBlob = blobContainer.GetBlobReferenceFromServer(filename);

newBlob.StartCopyFromBlob(blob.Uri);

blob.Delete();

服务器上没有新的blob,因此我收到了http 404 Not Found异常。

这是我找到的工作示例,但它适用于旧的.net存储API。

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

目前我正在使用2.0 API。我在哪里犯了错误?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

OP中的代码几乎没有问题,只是调用了异步复制方法。新API中最简单的代码应该是:

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