private static void Run(CloudStorageAccount sourceAccount, string sourceContainerName, CloudStorageAccount destinationAccount, string destinationContainerName)
{
var sourceBlobClient = sourceAccount.CreateCloudBlobClient();
var sourceContainer = sourceBlobClient.GetContainerReference(sourceContainerName);
sourceContainer.CreateIfNotExists();
var destinationBlobClient = destinationAccount.CreateCloudBlobClient();
var destinationContainer = destinationBlobClient.GetContainerReference(destinationContainerName);
destinationContainer.CreateIfNotExists();
destinationContainer.SetPermissions(new BlobContainerPermissions
{
PublicAccess = BlobContainerPublicAccessType.Blob
});
BlobContinuationToken continuationToken = null;
do
{
var segment = sourceContainer.ListBlobsSegmented(null, true, BlobListingDetails.Metadata, null, continuationToken, null, null);
continuationToken = segment.ContinuationToken;
var segmentCount = segment.Results.Count();
var stopWatch = new Stopwatch();
stopWatch.Start();
Console.WriteLine("Start processing {0} blobs...", segmentCount);
Parallel.ForEach(segment.Results, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 2 },
item =>
{
var cloudBlockBlob = item as CloudBlockBlob;
if (cloudBlockBlob != null)
{
var blobAsText = cloudBlockBlob.DownloadText();
blobAsText = ReplacePartialUrls(blobAsText, sourceContainerName, destinationContainerName);
using (var compressed = new MemoryStream())
{
using (var gzip = new StreamWriter(new GZipStream(compressed, CompressionMode.Compress, true)))
{
gzip.Write(blobAsText);
}
compressed.Position = 0;
var destinationBlob = destinationContainer.GetBlockBlobReference(cloudBlockBlob.Name);
destinationBlob.Properties.ContentEncoding = "gzip";
destinationBlob.Properties.ContentType = cloudBlockBlob.Properties.ContentType;
destinationBlob.Properties.CacheControl = cloudBlockBlob.Properties.CacheControl;
destinationBlob.UploadFromStream(compressed);
}
}
});
stopWatch.Stop();
Console.WriteLine("Processed {0} blobs. ({1:0.00} blob(s)/second)", segmentCount, segmentCount / stopWatch.Elapsed.TotalSeconds);
}
while (continuationToken != null);
}