Renombrar/Mover/Copiar un blob de Windows Azure Storage

Uno de los escenarios más comunes cuando trabajamos con blobs es dar la posibilidad al usuario de modificar el nombre del archivo, moverlo a otra ubicación o simplemente realizar una copia del mismo. A día de hoy no existe un método renombrar o mover, ya que, en realidad, estas acciones se basan en copiar el archivo de origen en otro blob con el nuevo nombre y, una vez completado, eliminar el original.

Una forma de llevar a cabo esta operación puede ser la siguiente:

        public void RenameBlob(string reference, string newName, string container)
        {
            var blobClient = _account.CreateCloudBlobClient();
            var oldBlob = blobClient.GetBlobReferenceFromServer(new Uri(reference));
            var newBlob = blobClient.GetContainerReference(container).GetBlockBlobReference(newName);
            newBlob.StartCopyFromBlob(oldBlob.Uri);
            while (newBlob.CopyState.Status == CopyStatus.Pending)
            {
                Console.WriteLine("{0} bytes copied from {1}", newBlob.CopyState.BytesCopied, newBlob.CopyState.TotalBytes);
                Thread.Sleep(1000);
            }
            if (newBlob.CopyState.Status != CopyStatus.Success)
                throw new Exception(newBlob.CopyState.StatusDescription);
            oldBlob.Delete();
        }

En el código anterior se utiliza la Uri del blob original (reference), el nuevo nombre que queremos asociar al resultante (newName) y el container donde queremos alojarlo (no tiene por qué ser el mismo que el de origen).

Al recuperar el blob original, estoy haciendo uso de GetBlobReferenceFromServer a nivel de blobClient, donde es obligatorio pasarle la ubicación completa del recurso. Si cometemos el error de intentar recuperar un blob que no existe en dicha ubicación este método lanzará una excepción. En el caso del nuevo blob, al no existir todavía, utilizamos GetBlockBlobReference a nivel de container, con el objetivo de conseguir una URL válida para nuestro nuevo recurso.

Una vez que tenemos los dos elementos, a través de StartCopyFromBlob comenzamos la copia en la nueva ubicación. Dentro de CopyState tenemos una serie de propiedades que nos permiten conocer el estado en el que se encuentra la copia, los bytes que lleva copiados hasta el momento, etcétera. En el código compruebo cada segundo si el proceso sigue estando pendiente y, en ese caso, muestro por consola la cantidad de bytes que lleva copiados hasta ese momento. Una vez cambia de estado, en el caso de que el siguiente sea distinto de Success lanzamos una excepción para visualizar el motivo por el cual la copia no se ha realizado correctamente (Abortion o Failure).

El paso final, si se trata de renombrar o mover de ubicación, sería eliminar el blob original. En el caso de que sólo queramos realizar una copia, basta con omitir la línea oldBlob.Delete();

Espero que sea de utilidad.

¡Saludos!