rakshith
rakshith

Reputation: 784

how to download the azure blob snapshots using c sharp in windows form application

I am creating windows application using c sharp to manage azure blobs.I am able to upload the blobs,download the blobs,take snapshot ,list the blobs etc.Now my task in download the snapshots of blobs(download the older vertion of the file).

i am downloading blob file using the following code

StorageCredentials creds = new StorageCredentials(accountName, accountKey);
        CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

        //MessageBox.Show(sender.ToString());
        Uri myUri;
        string uri;
        var btn = sender as Button;
        uri = btn.Text;
        if (btn != null)
        {
            // MessageBox.Show(btn.Text);

            myUri = new Uri(btn.Text);
            MessageBox.Show(myUri.ToString());

        }
        // Create the blob client.
        CloudBlobClient blobClient = account.CreateCloudBlobClient();
        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClient.GetContainerReference("samples");
        //CloudBlobContainer sampleContainer = client.GetContainerReference("samples");

        string[] parts = uri.Split('/');
        string fileName = "";

        if (parts.Length > 0)
            fileName = parts[parts.Length - 1];
        else
            fileName = uri;


        CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);

        // Save blob contents to a file.
        try
       {


            using (var fileStream =        System.IO.File.OpenWrite(@"C:\Users\dev1\Desktop\rakshi1.jpg"))
            {
                blockBlob.DownloadToStream(fileStream);
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

I am listing the snapshot of perticular blob using the following code


private void button1_Click(object sender, EventArgs e)
        {
            //MessageBox.Show(this.filename);
            //label1

            string s1= this.filename;
            string accountName = "portalvhdsq3jyv0y3gccrn";
            string accountKey = "VVPgjNO9V3397kOvoJRRZKtZVZaVNQP2xFPTNoWEp8zPJh4n487HVmwup498T8iufFnDS1Icu0EmUKyHg+DdkA==";


            StorageCredentials creds = new StorageCredentials(accountName, accountKey);
            CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);
            CloudBlobClient client = account.CreateCloudBlobClient();
            CloudBlobContainer sampleContainer = client.GetContainerReference("samples");
            sampleContainer.CreateIfNotExists();
            CloudBlockBlob blob = sampleContainer.GetBlockBlobReference(s1);

            CloudBlockBlob newBlob;

            //set the metadata and save it 
            blob.Metadata["OriginalFilename"] = s1;
            blob.SetMetadata();
            //create the snapshot
            newBlob = blob.CreateSnapshot();
            /*
             label3.Text ="Metadata['OriginalFilename'] = {0}, IsSnapshot = {1}, " + "SnapshotTime = {2}, snapshotURI = {3}"+ "   "+newBlob.Metadata["OriginalFilename"]+"  "+newBlob.IsSnapshot+" "+newBlob.SnapshotTime+" "+newBlob.SnapshotQualifiedUri;
             */
          //  label3.Text = "";
            string text1 = "";
            //retrieve all of the versions for this blob, then iterate through them
            IEnumerable listOfBlobs = sampleContainer.ListBlobs(s1, true, BlobListingDetails.Snapshots);
            foreach (IListBlobItem blobItem in listOfBlobs)
            {
                //you must cast this as a CloudBlockBlob 
                //  because blobItem does not expose all of the properties
                CloudBlockBlob theBlob = blobItem as CloudBlockBlob;

                //Call FetchAttributes so it retrieves the metadata.
                theBlob.FetchAttributes();

                //print the snapshot informatino
                /*  System.Diagnostics.Debug.Print("theBlob IsSnapshot = {0}, SnapshotTime = {1}, snapshotURI = {2}",
                    theBlob.IsSnapshot, theBlob.SnapshotTime, theBlob.SnapshotQualifiedUri);*/

               // text1 = text1 + "theBlob IsSnapshot = {0}, SnapshotTime = {1}, snapshotURI = {2}" + " @" + theBlob.IsSnapshot + " " + theBlob.SnapshotTime + " " + theBlob.SnapshotQualifiedUri;



                //in case there's more than one piece of metadata, 
                //  iterate through the metadata and display each key-value pair
                int index = 0;
                foreach (KeyValuePair kvPair in theBlob.Metadata)
                {
                    index++;
               //     text1 = text1 + "@.MetaData {0} = {1},{2}@" + index + kvPair.Key + kvPair.Value;
                }
                createButton(theBlob.SnapshotQualifiedUri);
           //     text1 = text1 + "@@@";
                MessageBox.Show(theBlob.SnapshotQualifiedUri.ToString());

            }
        //    text1 = text1.Replace("@", System.Environment.NewLine);

          //  label1.Text = text1;
            button2.Enabled = true;
        }

But i have no idea how to download each snapshots

i am updating this code with create_button and btn_click method





    private void createButton(Uri uri1)
        {
            MessageBox.Show("hhhhhhhis");

            //This block dynamically creates a Button and adds it to the form
            Button btn = new Button();
            btn.Name = "btn1";
            btn.Location = new Point(3 + i, 14 + x);
            btn.BackColor = System.Drawing.Color.White;
            btn.Text = uri1.ToString();
            btn.Width = 370;
            btn.TextAlign = ContentAlignment.MiddleLeft;
            //Hook our button up to our generic button handler
            btn.Click += new EventHandler(btn_Click);
            this.Controls.Add(btn);
            //  textBox1.Text = textBox1.Text + "hai";
            //i += 20;
            x += 30;

        }



 void btn_Click(object sender, EventArgs e)
        {
            StorageCredentials creds = new StorageCredentials(accountName, accountKey);
            CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

            //MessageBox.Show(sender.ToString());
            Uri myUri;
            string uri;
            var btn = sender as Button;
            uri = btn.Text;
            if (btn != null)
            {
                // MessageBox.Show(btn.Text);

                myUri = new Uri(btn.Text);
                MessageBox.Show(myUri.ToString());

            }
            // Create the blob client.
            CloudBlobClient blobClient = account.CreateCloudBlobClient();
            // Retrieve reference to a previously created container.
            CloudBlobContainer container = blobClient.GetContainerReference("samples");
            //CloudBlobContainer sampleContainer = client.GetContainerReference("samples");
            // Retrieve reference to a blob named "photo1.jpg".
            string[] parts = uri.Split('/');
            string fileName = "";

            if (parts.Length > 0)
                fileName = parts[parts.Length - 1];
            else
                fileName = uri;
            // MessageBox.Show(fileName);

            CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);

            // Save blob contents to a file.
            try
            {
                // using (Stream outputFile = new FileStream("rakshi.jpg", FileMode.Create))
                //{
                //blockBlob.DownloadToStream(outputFile);
                //}


                using (var fileStream = System.IO.File.OpenWrite(@"C:\Users\dev1\Desktop\rakshi1.jpg"))
                {
                    blockBlob.DownloadToStream(fileStream);
                }
            }

            catch (Exception ex)
            {
                // Console.WriteLine(ex);
                MessageBox.Show(ex.ToString());
            }







        }



Create_button() function calls for each snapshot and display another form with list of button coresponds to snapshots when i click on the button i should download the snapshot.but now it fires some exception

Upvotes: 4

Views: 1959

Answers (1)

Gaurav Mantri
Gaurav Mantri

Reputation: 136126

It's actually pretty straight forward! Once you have identified that the blob's IsSnapshot property is true, you can simply call download function on that blob. See the sample code here:

    static void DownloadBlobSnapshot()
    {
        var cred = new StorageCredentials(accountName, accountKey);
        var account = new CloudStorageAccount(cred, true);
        var client = account.CreateCloudBlobClient();
        var container = client.GetContainerReference("snapshot-download-test");
        IEnumerable listOfBlobs = container.ListBlobs(null, true, BlobListingDetails.Snapshots);
        var downloadPath = @"D:\temp\";
        foreach (IListBlobItem blobItem in listOfBlobs)
        {
            var theBlob = blobItem as CloudBlockBlob;
            if (theBlob != null)
            {
                if (theBlob.IsSnapshot)
                {
                    theBlob.DownloadToFile(downloadPath + theBlob.Name.Replace("/", "\\"), FileMode.Create);
                }
            }
        }
    }

You don't need to fetch blob's attribute or metadata. Obviously the code above is pretty simple. If a blob has multiple snapshots and you wish to save each snapshot separately, you would need to insert blob's snapshot date/time in the file name.

Upvotes: 3

Related Questions