3

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

这是我的做法,通过创建新的 blob 并从旧的 blob 复制。

var newBlob = blobContainer.GetBlobReferenceFromServer(filename);

newBlob.StartCopyFromBlob(blob.Uri);

blob.Delete();

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

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

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

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

4

2 回答 2

7

我看到您正在使用GetBlobReferenceFromServer方法来创建新 blob 对象的实例。要使此功能正常工作,必须存在 blob,但在您尝试重命名 blob 时不会出现这种情况。

您可以做的是调用GetBlobReferenceFromServer旧 blob,获取它的类型,然后创建 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();
于 2013-04-20T15:06:33.740 回答
0

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

var oldBlob = cloudBlobClient.GetBlobReferenceFromServer(oldBlobUri);
var newBlob = container.GetBlobReference("newblobname");
newBlog.CopyFromBlob(oldBlob);
oldBlob.Delete();
于 2013-10-04T12:48:56.157 回答