// Retrieve the list of regions in use for a page blob.
        // Return true on success, false if not found, throw exception on error.

        public bool GetPageRegions(string containerName, string blobName, out PageRange[] regions)
        {
            regions = null;

            try
            {
                CloudBlobContainer container = BlobClient.GetContainerReference(containerName);
                CloudPageBlob      blob      = container.GetPageBlobReference(blobName);

                IEnumerable <PageRange> regionList = blob.GetPageRanges();
                regions = new PageRange[regionList.Count()];
                int i = 0;
                foreach (PageRange region in regionList)
                {
                    regions[i++] = region;
                }
                return(true);
            }
            catch (StorageClientException ex)
            {
                if ((int)ex.StatusCode == 404)
                {
                    return(false);
                }

                throw;
            }
        }
        public static long GetActualDiskSizeAsync(this CloudPageBlob pageBlob, long range = 5 /* default is 5 GB */)
        {
            pageBlob.FetchAttributes();
            long   pageBlobSize = 0;
            Object _Lock        = new Object();

            long rangeSize = range * 1024 * 1024 * 1024;

            List <long> offsetList  = new List <long>();
            long        startOffset = 0;

            while (startOffset < pageBlob.Properties.Length)
            {
                offsetList.Add(startOffset);
                startOffset += rangeSize;
            }

            // add blob name size and metadata size
            pageBlobSize += (124 + pageBlob.Name.Length * 2 + pageBlob.Metadata.Sum(m => m.Key.Length + m.Value.Length + 3));

            Parallel.ForEach(offsetList, (currentOffset) =>
            {
                long tmp = pageBlob.GetPageRanges(currentOffset, rangeSize).Sum(r => 12 + (r.EndOffset - r.StartOffset));
                lock (_Lock)
                {
                    pageBlobSize += tmp;
                }
                // Console.WriteLine("Process {0} on thread {1}: {2}", currentOffset, Thread.CurrentThread.ManagedThreadId, GetFormattedDiskSize(pageBlobSize));
            });
            Task.WaitAll();
            return(pageBlobSize);
        }
Exemple #3
0
        private IEnumerable <IndexRange> GetPageRanges()
        {
            pageBlob.FetchAttributes(new AccessCondition(), blobRequestOptions);
            IEnumerable <PageRange> pageRanges = pageBlob.GetPageRanges(null, null, new AccessCondition(), blobRequestOptions);

            pageRanges.OrderBy(range => range.StartOffset);
            return(pageRanges.Select(pr => new IndexRange(pr.StartOffset, pr.EndOffset)));
        }
        public static void DownloadVHDFromCloud(CloudBlobClient blobStorage, string containerName, string blobName)
        {
            CloudBlobContainer container = blobStorage.GetContainerReference(containerName);
            CloudPageBlob      pageBlob  = container.GetPageBlobReference(blobName);

            // Get the length of the blob
            pageBlob.FetchAttributes();
            long vhdLength       = pageBlob.Properties.Length;
            long totalDownloaded = 0;

            Console.WriteLine("Vhd size:  " + Megabytes(vhdLength));

            // Create a new local file to write into
            FileStream fileStream = new FileStream(blobName, FileMode.Create, FileAccess.Write);

            fileStream.SetLength(128 * OneMegabyteAsBytes);

            // Download the valid ranges of the blob, and write them to the file
            IEnumerable <PageRange> pageRanges = pageBlob.GetPageRanges();
            Stream blobStream = pageBlob.OpenRead();

            foreach (PageRange range in pageRanges)
            {
                // EndOffset is inclusive... so need to add 1
                int rangeSize = (int)(range.EndOffset + 1 - range.StartOffset);

                // Chop range into 4MB chucks, if needed
                for (int subOffset = 0; subOffset < rangeSize; subOffset += FourMegabyteAsBytes)
                {
                    int subRangeSize = Math.Min(rangeSize - subOffset, FourMegabyteAsBytes);
                    blobStream.Seek(range.StartOffset + subOffset, SeekOrigin.Begin);
                    fileStream.Seek(range.StartOffset + subOffset, SeekOrigin.Begin);

                    Console.WriteLine("Range: ~" + Megabytes(range.StartOffset + subOffset)
                                      + " + " + PrintSize(subRangeSize));
                    byte[] buffer = new byte[subRangeSize];

                    blobStream.Read(buffer, 0, subRangeSize);
                    fileStream.Write(buffer, 0, subRangeSize);
                    totalDownloaded += subRangeSize;
                    if (totalDownloaded > 128 * OneMegabyteAsBytes)
                    {
                        break;
                    }
                }
                if (totalDownloaded > 128 * OneMegabyteAsBytes)
                {
                    break;
                }
            }
            Console.WriteLine("Downloaded " + Megabytes(totalDownloaded) + " of " + Megabytes(vhdLength));
        }
        /// <summary>
        /// Get for a Page Blob the page ranges
        /// </summary>
        /// <param name="containerName">the container name</param>
        /// <param name="blobName">the blob name</param>
        /// <param name="pageRanges">OUT - enumeration of page ranges</param>
        /// <returns>Return true on success, false if unable to create, throw exception on error.</returns>
        public bool GetPageRanges(string containerName, string blobName, out IEnumerable <PageRange> pageRanges)
        {
            try
            {
                CloudBlobContainer container = _blobClient.GetContainerReference(containerName);
                CloudPageBlob      blob      = container.GetPageBlobReference(blobName);
                pageRanges = blob.GetPageRanges();
                return(true);
            }
            catch (StorageException ex)
            {
                if (ex.RequestInformation.HttpStatusCode == 404)
                {
                    pageRanges = null;
                    return(false);
                }

                throw;
            }
        }
        private static bool ComparePageRange(CloudPageBlob pageBlob0, CloudPageBlob pageBlob1)
        {
            List <PageRange> pageRanges0 = pageBlob0.GetPageRanges().ToList();
            List <PageRange> pageRanges1 = pageBlob1.GetPageRanges().ToList();
            int numPageRanges0           = pageRanges0.Count();
            int numPageRanges1           = pageRanges1.Count();

            if (numPageRanges0 != numPageRanges1)
            {
                return(false);
            }
            pageRanges0 = pageRanges0.OrderBy(pageRange => pageRange.StartOffset).ToList();
            pageRanges1 = pageRanges1.OrderBy(pageRange => pageRange.StartOffset).ToList();
            for (int i = 0; i < numPageRanges0; ++i)
            {
                if (pageRanges0[i].StartOffset != pageRanges1[i].StartOffset ||
                    pageRanges0[i].EndOffset != pageRanges1[i].EndOffset)
                {
                    return(false);
                }
            }
            return(true);
        }
        // public static long pageBlobSize = 0;
        /// <summary>
        /// Based on this script: http://gallery.technet.microsoft.com/scriptcenter/Get-Billable-Size-of-32175802
        /// </summary>
        /// <returns></returns>
        public static long GetActualDiskSize(this CloudPageBlob pageBlob, bool PageRange = false)
        {
            pageBlob.FetchAttributes();

            if (PageRange)
            {
                long pageBlobSize = 0;
                long startOffset  = 0;
                long rangeSize    = 1024 * 1024 * 1024; //1 GB
                Console.Write("Calculating...");
                while (startOffset < pageBlob.Properties.Length)
                {
                    pageBlobSize += pageBlob.GetPageRanges(startOffset, rangeSize).Sum(r => 12 + (r.EndOffset - r.StartOffset));
                    startOffset  += rangeSize;
                    Console.Write("...");
                }

                return(124 + pageBlob.Name.Length * 2 + pageBlob.Metadata.Sum(m => m.Key.Length + m.Value.Length + 3) + pageBlobSize);
            }
            else
            {
                return(124 + pageBlob.Name.Length * 2 + pageBlob.Metadata.Sum(m => m.Key.Length + m.Value.Length + 3) + pageBlob.GetPageRanges().Sum(r => 12 + (r.EndOffset - r.StartOffset)));
            }
        }
        private static async Task PageBlobProcessAsync()
        {
            CloudStorageAccount storageAccount = null;

            CloudBlobContainer cloudBlobContainer = null;



            // Retrieve the connection string for use with the application. The storage connection string is stored

            // in an environment variable on the machine running the application called storageconnectionstring.

            // If the environment variable is created after the application is launched in a console or with Visual

            // Studio, the shell needs to be closed and reloaded to take the environment variable into account.

            string storageConnectionString = ConfigurationManager.AppSettings["StorageConnectionString"]; //Environment.GetEnvironmentVariable("StorageConnectionString");


            //storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

            // Check whether the connection string can be parsed.

            if (CloudStorageAccount.TryParse(storageConnectionString, out storageAccount))
            {
                try

                {
                    // Create the CloudBlobClient that represents the Blob storage endpoint for the storage account.

                    CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();

                    //127.0.0.1:10000/devstoreaccount1/testcont

                    // Create a container called 'quickstartblobs' and append a GUID value to it to make the name unique.

                    cloudBlobContainer = cloudBlobClient.GetContainerReference("testcontpageblob");// "quickstartblobs" + Guid.NewGuid().ToString());

                    await cloudBlobContainer.CreateIfNotExistsAsync();

                    Console.WriteLine("Created container '{0}'", cloudBlobContainer.Name);

                    Console.WriteLine();



                    // Set the permissions so the blobs are public.

                    BlobContainerPermissions permissions = new BlobContainerPermissions

                    {
                        PublicAccess = BlobContainerPublicAccessType.Blob
                    };

                    await cloudBlobContainer.SetPermissionsAsync(permissions);



                    byte[] data = new byte[512];
                    Random rnd  = new Random();
                    rnd.NextBytes(data);


                    // Get a reference to the blob address, then upload the file to the blob.

                    // Use the value of localFileName for the blob name.

                    CloudPageBlob cloudPageBlob = cloudBlobContainer.GetPageBlobReference("SamplePage");
                    cloudPageBlob.Create(512);


                    cloudPageBlob.WritePages(new MemoryStream(data), 0);


                    // List the blobs in the container.

                    Console.WriteLine("Listing blobs in container.");

                    BlobContinuationToken blobContinuationToken = null;

                    do

                    {
                        var results = await cloudBlobContainer.ListBlobsSegmentedAsync(null, blobContinuationToken);

                        // Get the value of the continuation token returned by the listing call.

                        blobContinuationToken = results.ContinuationToken;

                        foreach (IListBlobItem item in results.Results)

                        {
                            Console.WriteLine(item.Uri);
                        }
                    } while (blobContinuationToken != null); // Loop while the continuation token is not null.

                    Console.WriteLine("Read the PageRanges");

                    cloudPageBlob.FetchAttributes();
                    Console.WriteLine("Blob length = {0}", cloudPageBlob.Properties.Length);

                    IEnumerable <PageRange> ranges = cloudPageBlob.GetPageRanges();
                    Console.Write("{0}:<", "Writing Data From PageBlob");
                    foreach (PageRange range in ranges)
                    {
                        Console.Write("[{0}-{1}]", range.StartOffset, range.EndOffset);
                    }
                    Console.WriteLine(">");


                    Console.WriteLine("Delete the PageBlob");
                    await cloudPageBlob.DeleteAsync();
                }

                catch (StorageException ex)

                {
                    Console.WriteLine("Error returned from the service: {0}", ex.Message);
                }

                finally

                {
                    // Console.WriteLine("Press any key to delete the sample files and example container.");

                    Console.ReadLine();

                    // Clean up resources. This includes the container and the two temp files.

                    //Console.WriteLine("Deleting the container and any blobs it contains");

                    if (cloudBlobContainer != null)
                    {
                        // await cloudBlobContainer.DeleteIfExistsAsync();
                    }
                }
            }

            else

            {
                Console.WriteLine(

                    "A connection string has not been defined in the system environment variables. " +

                    "Add a environment variable named 'storageconnectionstring' with your storage " +

                    "connection string as a value.");
            }
        }
 /// <summary>
 /// Based on this script: http://gallery.technet.microsoft.com/scriptcenter/Get-Billable-Size-of-32175802
 /// </summary>
 /// <returns></returns>
 public static long GetActualDiskSize(this CloudPageBlob pageBlob)
 {
     pageBlob.FetchAttributes();
     return(124 + pageBlob.Name.Length * 2 + pageBlob.Metadata.Sum(m => m.Key.Length + m.Value.Length + 3) + pageBlob.GetPageRanges().Sum(r => 12 + (r.EndOffset - r.StartOffset)));
 }
        //******************
        //*                *
        //*  ShowPageBlob  *
        //*                *
        //******************
        // Display properties for a specific page blob.

        public void ShowPageBlob(CloudPageBlob blob)
        {
            Cursor = Cursors.Wait;

            try
            {
                PagesTab.Visibility   = System.Windows.Visibility.Visible;
                ContentTab.Visibility = System.Windows.Visibility.Collapsed;

                PageBlob      = blob;
                IsBlobChanged = false;
                this.Title    = "View Blob - " + blob.Name;

                // Display blob properties.

                PropBlobType.Text = "Page";

                PropCacheControl.Text = blob.Properties.CacheControl;

                PropContainer.Text = blob.Container.Name;

                PropContentDisposition.Text = blob.Properties.ContentDisposition;

                PropContentEncoding.Text = blob.Properties.ContentEncoding;

                PropContentLanguage.Text = blob.Properties.ContentLanguage;

                PropContentMD5.Text = blob.Properties.ContentMD5;

                PropContentType.Text = blob.Properties.ContentType;

                if (blob.CopyState != null)
                {
                    PropCopyState.Text = blob.CopyState.ToString();
                }

                if (blob.Properties.ETag != null)
                {
                    PropETag.Text = blob.Properties.ETag.Replace("\"", String.Empty).Replace("0x", String.Empty);
                }

                if (blob.IsSnapshot)
                {
                    PropIsSnapshot.Text = "True";
                }
                else
                {
                    PropIsSnapshot.Text = "False";
                }

                PropLastModified.Text = blob.Properties.LastModified.ToString();

                PropLeaseDuration.Text = blob.Properties.LeaseDuration.ToString();

                PropLeaseState.Text = blob.Properties.LeaseState.ToString();

                PropLeaseStatus.Text = blob.Properties.LeaseStatus.ToString();

                PropLength.Text = blob.Properties.Length.ToString();

                PropName.Text = blob.Name;

                PropParent.Text = blob.Parent.Container.Name;

                PropSnapshotQualifiedStorageUri.Text = blob.SnapshotQualifiedStorageUri.ToString().Replace("; ", ";\n");

                PropSnapshotQualifiedUri.Text = blob.SnapshotQualifiedUri.ToString().Replace("; ", ";\n");

                if (blob.SnapshotTime.HasValue)
                {
                    PropSnapshotTime.Text = blob.SnapshotTime.ToString();
                }

                PropStorageUri.Text = blob.StorageUri.ToString().Replace("; ", ";\n");

                PropStreamMinimumReadSizeInBytes.Text = blob.StreamMinimumReadSizeInBytes.ToString();

                PropStreamWriteSizeInBytes.Text = blob.StreamWriteSizeInBytes.ToString();

                PropUri.Text = blob.Uri.ToString().Replace("; ", ";\n");

                // Read page ranges in use and display in Pages tab.

                MaxPageNumber = (blob.Properties.Length / 512) - 1;

                IEnumerable <Microsoft.WindowsAzure.Storage.Blob.PageRange> ranges = PageBlob.GetPageRanges();

                PageRanges.Items.Clear();

                long startPage, endPage;
                int  rangeCount = 0;
                if (ranges != null)
                {
                    long pages = PageBlob.Properties.Length / 512;
                    foreach (Microsoft.WindowsAzure.Storage.Blob.PageRange range in ranges)
                    {
                        startPage = (range.StartOffset) / 512;
                        endPage   = (range.EndOffset) / 512;
                        long offset    = range.StartOffset;
                        long endOffset = offset + 512 - 1;
                        int  index     = 0;
                        for (long page = startPage; page <= endPage; page++)
                        {
                            index = PageRanges.Items.Add("Page " + page.ToString() + ": (" + offset.ToString() + " - " + endOffset.ToString() + ")");
                            rangeCount++;
                            offset    += 512;
                            endOffset += 512;
                        }
                    }
                }
                if (rangeCount == 0)
                {
                    PageRanges.Items.Add("None - no pages allocated");
                }

                Cursor = Cursors.Arrow;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }