Azure Blob storage is a service for storing large amounts of unstructured data.In this article we will look how we can move blob between two containers.
Introduction
Azure Blob storage is a service for storing large amounts of unstructured data.In this article we will look how we can move blob between two containers.
Step 1: Create a Source and Destination Blob Container in the Azure Portal
Open the Azure portal(https://portal.azure.com), and then choose Storage Account say Containers
Create a source container say sourcecontainer
Likewise,create a destination container say destinationcontainer
It will appear as
Step 2: Upload a file in the Source Container
We have uploaded a html file into the source container.
Step 3: Moving the blob between the containers programatically
Fire up a console application and add the below Nuget packages
Install-Package WindowsAzure.Storage
Install-Package Microsoft.WindowsAzure.ConfigurationManager
Next write the below function
/// <summary>
/// GetBlobContainerReference
/// Gets a reference to the CloudBlobContainer
/// </summary>
/// <param name="connectionString"></param>
/// <param name="containerName"></param>
/// <returns></returns>
private static CloudBlobContainer GetBlobContainerReference(string connectionString, string containerName)
{
//Get the Microsoft Azure Storage account
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
//Create the Blob service client.
CloudBlobClient blobclient = storageAccount.CreateCloudBlobClient();
//Returns a reference to a Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer object with the specified name.
CloudBlobContainer blobcontainer = blobclient.GetContainerReference(containerName);
return blobcontainer;
}
The above function will return a reference to the CloudBlobContainer object with the name specified.
/// <summary>
/// MoveBlobBetweenContainers
/// Move a blob from source to destination container
/// </summary>
/// <param name="srcBlob"></param>
/// <param name="destContainer"></param>
private static void MoveBlobBetweenContainers(CloudBlockBlob srcBlob, CloudBlobContainer destContainer)
{
CloudBlockBlob destBlob;
//Copy source blob to destination container
using (MemoryStream memoryStream = new MemoryStream())
{
srcBlob.DownloadToStream(memoryStream);
//put the time stamp
var newBlobName = srcBlob.Name.Split('.')[0] + "_" + DateTime.Now.ToString("ddMMyyyy", CultureInfo.InvariantCulture) + "." + srcBlob.Name.Split('.')[1];
destBlob = destContainer.GetBlockBlobReference(newBlobName);
//copy source blob content to destination blob
destBlob.StartCopy(srcBlob);
}
//remove source blob after copy is done.
srcBlob.Delete();
}
This function reads the source blob's content and copies to the destination blob. Kindly note that, the destination blob's name is timestamped. After the operation is over, the program deletes the source blob.
Now inside the main function, let us write the below code
static void Main(string[] args)
{
string connectionString = CloudConfigurationManager.GetSetting("StorageConnectionString"); //blob connection string
string sourceContainerName = ConfigurationManager.AppSettings["sourcecontainerName"]; //source container name
string destinationContainerName = ConfigurationManager.AppSettings["destinationcontainerName"]; //destination container name
string sourceBlobFileName = "source.html"; //source blob name
//Gets a reference to the CloudBlobContainer
var sourceBlobContainerReference = GetBlobContainerReference(connectionString, sourceContainerName);
var destinationBlobContainerReference = GetBlobContainerReference(connectionString, destinationContainerName);
var sourceBlob = sourceBlobContainerReference.GetBlockBlobReference(sourceBlobFileName);
MoveBlobBetweenContainers(sourceBlob, destinationBlobContainerReference);
}
The program invokes the MoveBlobBetweenContainers function to move the blob. To get the Blob Connection string, go to Access key section, and get the Connection String

The app.config file looks as under
<appSettings>
<add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=testaccount;AccountKey=CRd****==;EndpointSuffix=core.windows.net" />
<add key="sourcecontainerName" value="sourcecontainer" />
<add key="destinationcontainerName" value="destinationcontainer" />
</appSettings>
The complete program is as under
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Configuration;
using System.Globalization;
using System.IO;
namespace UploadFilesToBlob
{
class Program
{
static void Main(string[] args)
{
string connectionString = CloudConfigurationManager.GetSetting("StorageConnectionString"); //blob connection string
string sourceContainerName = ConfigurationManager.AppSettings["sourcecontainerName"]; //source blob container name
string destinationContainerName = ConfigurationManager.AppSettings["destinationcontainerName"]; //destination blob container name
string sourceBlobFileName = "source.html"; //source blob name
//Gets a reference to the CloudBlobContainer
var sourceBlobContainerReference = GetBlobContainerReference(connectionString, sourceContainerName);
var destinationBlobContainerReference = GetBlobContainerReference(connectionString, destinationContainerName);
var sourceBlob = sourceBlobContainerReference.GetBlockBlobReference(sourceBlobFileName);
MoveBlobBetweenContainers(sourceBlob, destinationBlobContainerReference);
}
/// <summary>
/// MoveBlobBetweenContainers
/// Move a blob from source to destination container
/// </summary>
/// <param name="srcBlob"></param>
/// <param name="destContainer"></param>
private static void MoveBlobBetweenContainers(CloudBlockBlob srcBlob, CloudBlobContainer destContainer)
{
CloudBlockBlob destBlob;
//Copy source blob to destination container
using (MemoryStream memoryStream = new MemoryStream())
{
srcBlob.DownloadToStream(memoryStream);
//put the time stamp
var newBlobName = srcBlob.Name.Split('.')[0] + "_" + DateTime.Now.ToString("ddMMyyyy", CultureInfo.InvariantCulture) + "." + srcBlob.Name.Split('.')[1];
destBlob = destContainer.GetBlockBlobReference(newBlobName);
//copy source blob content to destination blob
destBlob.StartCopy(srcBlob);
}
//remove source blob after copy is done.
srcBlob.Delete();
}
/// <summary>
/// GetBlobContainerReference
/// Gets a reference to the CloudBlobContainer
/// </summary>
/// <param name="connectionString"></param>
/// <param name="containerName"></param>
/// <returns></returns>
private static CloudBlobContainer GetBlobContainerReference(string connectionString, string containerName)
{
//Get the Microsoft Azure Storage account
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
//Create the Blob service client.
CloudBlobClient blobclient = storageAccount.CreateCloudBlobClient();
//Returns a reference to a Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer object with the specified name.
CloudBlobContainer blobcontainer = blobclient.GetContainerReference(containerName);
return blobcontainer;
}
}
}
Now let us run the program. The file has been copied to destination container with timestamped.

And as expected, the blob(source.html) from the source container is deleted.

Conclusion
In this article we looked into how we can move blob between two containers. Hope this will be helpful. Thanks for reading. Zipped file attached.