Después de indagar en varios repositorios y sitios al final nos encontramos con la resolución que te mostraremos pronto.
Solución:
ACTUALIZAR:
Actualicé el código después de los comentarios de @IsaacAbrahams y la respuesta de @ Viggity, esta versión debería evitar que tenga que cargar todo en un MemoryStream y espera hasta que se complete la copia antes de eliminar el blob de origen.
Para cualquiera que llegue tarde a la fiesta pero se tropiece con esta publicación usando Azure Storage API V2, aquí hay un método de extensión para hacerlo rápido y sucio (+ versión asincrónica):
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();
Actualización para Azure Storage 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();
Descargo de responsabilidad: este es un método rápido y sucio para hacer que el cambio de nombre se ejecute de forma sincrónica. Se ajusta a mis propósitos, sin embargo, como señalaron otros usuarios, la copia puede llevar mucho tiempo (hasta días), por lo que la mejor manera es NO realizar esto en 1 método como esta respuesta, sino en su lugar:
- Iniciar el proceso de copia
- Sondear el estado de la operación de copia
- Elimine el blob original cuando se complete la copia.
Hay una forma práctica de hacerlo, aunque la API de Azure Blob Service no admite directamente la capacidad de cambiar el nombre o mover blobs.
Sin embargo, puede copiar y luego eliminar.
Reseñas y calificaciones
Recuerda que puedes optar por la opción de aclarar tu experiencia si atinaste tu contratiempo a tiempo.