我正在使用c sharp创建windows应用程序来管理azure blobs . 我能够上传blob,下载blob,拍摄快照,列出blob等 . 现在我的任务是下载blob的快照(下载文件的旧版本) ) .
我正在使用以下代码下载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 回答
它's actually pretty straight forward! Once you have identified that the blob' s
IsSnapshot
属性为true,你可以简单地在那个blob上调用下载功能 . 请在此处查看示例代码:您无需获取blob的属性或元数据 . 显然上面的代码非常简单 . 如果blob具有多个快照,并且您希望单独保存每个快照,则需要在文件名中插入blob的快照日期/时间 .