ОБНОВЛЕНИЕ:
Я обновил код после комментариев @IsaacAbrahams и ответа @ Viggity, эта версия должна препятствовать загрузке всего в MemoryStream и ждет завершения копирования перед удалением исходного большого двоичного объекта.
Для тех, кто опаздывает на вечеринку, но спотыкается на этом посте, используя Azure Storage API V2, вот метод расширения, который делает это быстро и грязно (+ асинхронная версия):
public static class BlobContainerExtensions
{
public static void Rename(this CloudBlobContainer container, string oldName, string newName)
{
//Warning: this Wait() is bad practice and can cause deadlock issues when used from ASP.NET applications
RenameAsync(container, oldName, newName).Wait();
}
public static async Task RenameAsync(this CloudBlobContainer container, string oldName, string newName)
{
var source = await container.GetBlobReferenceFromServerAsync(oldName);
var target = container.GetBlockBlobReference(newName);
await target.StartCopyFromBlobAsync(source.Uri);
while (target.CopyState.Status == CopyStatus.Pending)
await Task.Delay(100);
if (target.CopyState.Status != CopyStatus.Success)
throw new Exception("Rename failed: " + target.CopyState.Status);
await source.DeleteAsync();
}
}
Обновление для хранилища Azure 7.0
public static async Task RenameAsync(this CloudBlobContainer container, string oldName, string newName)
{
CloudBlockBlob source =(CloudBlockBlob)await container.GetBlobReferenceFromServerAsync(oldName);
CloudBlockBlob target = container.GetBlockBlobReference(newName);
await target.StartCopyAsync(source);
while (target.CopyState.Status == CopyStatus.Pending)
await Task.Delay(100);
if (target.CopyState.Status != CopyStatus.Success)
throw new Exception("Rename failed: " + target.CopyState.Status);
await source.DeleteAsync();
}
Отказ от ответственности: Это быстрый и грязный способ заставить переименование выполняться синхронно.Это соответствует моим целям, однако, как отметили другие пользователи, копирование может занять много времени (до нескольких дней), поэтому лучше всего НЕ выполнять это одним способом, как этот ответ, а вместо этого:
- Запустите процесс копирования
- Опрос состояния операции копирования
- Удалите исходный большой двоичный объект после завершения копирования.