Saltar al contenido

Cambio de nombre de blob de Azure Storage

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *