我正在尝试通过.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。我在哪里犯了错误?
答案 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();