3

.net API を使用して Azure Storage の BLOB の名前を変更しようとしていますが、1 日経っても BLOB ファイルの名前を変更できません:(

新しいブロブを作成し、古いブロブからコピーすることで、これを行う方法を次に示します。

var newBlob = blobContainer.GetBlobReferenceFromServer(filename);

newBlob.StartCopyFromBlob(blob.Uri);

blob.Delete();

サーバーに新しいブロブがないため、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 オブジェクトのインスタンスを作成しているようです。この関数が機能するには、ブロブが存在する必要がありますが、ブロブの名前を変更しようとしている場合はそうではありません。

あなたができることは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();
于 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 に答える