如何在Windows窗体应用程序中使用c sharp下载azure blob快照

时间:2016-06-23 09:36:51

标签: c# windows azure

我正在使用c sharp创建windows应用程序来管理azure blobs。我能够上传blob,下载blob,拍摄快照,列出blob等。现在我的任务是下载blob的快照(下载旧的vertion该文件)。

我正在使用以下代码下载blob文件

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());
        }

我使用以下代码列出了特定blob的快照


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;
        }

但我不知道如何下载每个快照

我正在使用create_button和btn_click方法

更新此代码




    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()函数调用每个快照并显示另一个表单,其中按钮列表对应快照,当我点击按钮时我应该下载快照。但现在它会触发一些异常

1 个答案:

答案 0 :(得分:2)

实际上非常直接!一旦确定blob的IsSnapshot属性为true,就可以在该blob上调用download函数。请参阅此处的示例代码:

    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);
                }
            }
        }
    }

您无需获取blob的属性或元数据。显然,上面的代码非常简单。如果blob具有多个快照,并且您希望单独保存每个快照,则需要在文件名中插入blob的快照日期/时间。