BlobCompressor.Program.Run C# (CSharp) Method

Run() private static method

private static Run ( Microsoft.WindowsAzure.Storage.CloudStorageAccount sourceAccount, string sourceContainerName, Microsoft.WindowsAzure.Storage.CloudStorageAccount destinationAccount, string destinationContainerName ) : void
sourceAccount Microsoft.WindowsAzure.Storage.CloudStorageAccount
sourceContainerName string
destinationAccount Microsoft.WindowsAzure.Storage.CloudStorageAccount
destinationContainerName string
return void
        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);
        }