Не удается переименовать файл большого двоичного объекта в хранилище Azure

Я пытаюсь переименовать BLOB-объект в хранилище Azure через API .net, и я не могу переименовать файл BLOB-объекта через день: (

Вот как я это делаю, создавая новый blob и копируя старый.

var newBlob = blobContainer.GetBlobReferenceFromServer(filename);

newBlob.StartCopyFromBlob(blob.Uri);

blob.Delete();

На сервере нет нового большого двоичного объекта, поэтому я получаю исключение http 404 Not Found.

Вот рабочий пример, который я нашел, но он для старого API хранилища .net.

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

В настоящее время я использую API 2.0. Где я ошибаюсь?


person Freshblood    schedule 20.04.2013    source источник


Ответы (2)


Я вижу, что вы используете метод GetBlobReferenceFromServer для создания экземпляра нового объекта 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();
person Gaurav Mantri    schedule 20.04.2013
comment
В новом api нет GetBlockReference. Новый API предоставляет метод GetBlobReferenceFromServer. Без тестирования вашего кода я не могу понять, как ваш код избавляется от исключения http not found при копировании в не существующий blob. - person Freshblood; 20.04.2013
comment
Да, есть: msdn .microsoft.com / en-us / library / windowsazure /. GetBlobReferenceFromServer следует использовать, когда вы заранее не знаете тип большого двоичного объекта и для этого он должен присутствовать. На самом деле, теперь, когда я более внимательно прочитал ваш вопрос, я отредактировал свой ответ (извините за это, мне следовало более внимательно прочитать ваш вопрос на первом этапе). - person Gaurav Mantri; 20.04.2013
comment
По-прежнему строка newBlob.StartCopyFromBlob (blob.Uri) выдает исключение http not found: ((( - person Freshblood; 20.04.2013
comment
Вы можете опубликовать полный код? Или попробуйте запустить написанный мной код. У меня сработало из консольного приложения. - person Gaurav Mantri; 20.04.2013
comment
Хорошо, это работает, и проблема не в коде. Но все же я не считаю, что цикл while необходим. Спасибо - person Freshblood; 21.04.2013
comment
Цикл необходим, потому что, если файл достаточно велик и вы не выполняете ожидание, вы можете удалить его, поскольку он все еще копируется в место назначения. @eMazeika предлагает использовать метод CopyFromBlob (), но он больше не существует в Azure. Поэтому использование метода StartCopyFromBlob () и ожидание его завершения - единственный метод, который, как я обнаружил, работает. Гаурав Мантри - хорошая работа. - person STLDev; 24.11.2013

Код в OP был почти в порядке, за исключением того, что был вызван метод асинхронного копирования. Самый простой код в новом API должен быть:

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