Page Blobに書き込んでみたい・・・、けど失敗中・・・orz
id:waritohutsu:20091216の日記で書いた内容では、「Page BlobとBlock Blobの種類を指定するタイミングが分からない」という記述をしていましたが、Page Blobの謎が少しだけ解けたので情報を展開します。
Page Blobの参照取得方法
「いつPage Blobと指定するのか分からない」と記述しましたが、、「Blobの参照取得時」または「Blobの新規作成時」にPage BlobかBlock Blobをきちんと指定するようです。
//Blob?の参照を取得 var blob = blobContainer.GetBlobReference(blobAddressUri); //blob.ToPageBlobでPageBlobにも出来る //Block Blobの参照を取得 var blockBlob = blobContainer.GetBlockBlobReference(blobAddressUri); //Page Blobの参照を取得 var pageBlob = blobContainer.GetPageBlobReference(blobAddressUri);
CloudBlobContainer.GetXXXBlobReferenceメソッドは、「Blobの参照取得時」または「Blobの新規作成時」に利用されます。上記の3つのどれを使うかは、コード例から察するに以下のパターンかと思ってます。
- CloudBlobContainer.GetBlobReference():Block Blob or Page Blob両方の参照を取得*1できるので、既に作成したBlobインスタンスの参照を取得したい場合
- CloudBlobContainer.GetBlockBlobReference():Block Blobの参照を取得し、これからBlock Blobインスタンスを作成する場合
- CloudBlobContainer.GetPageBlobReference():Page Blobの参照を取得し、これからPage Blobインスタンスを作成する場合
Page Blobに対する書き込み方法
参照の取得方法は分かったので、実際にPage Blobに書き込みを行う方法を調査してみました。結果、Page Blobに対する書き込み方法は以下の方法が存在しました*2。
- BlobStreamクラスを利用した書き込み
- CloudPageBlob.UploadText()メソッドを利用した書き込み
- CloudPageBlob.WritePage()メソッドを利用した書き込み
- CloudPageBlob.UploadByteArray()メソッドを利用した書き込み
- CloudPageBlob.UploadFile()メソッドを利用した書き込み
- CloudPageBlob.UploadFromStream()メソッドを利用した書き込み
作成したコード例を載せますが、現時点では全ての手法で書き込みが失敗しています…。求む!情報!!
コード例
using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.StorageClient; using System.Diagnostics; using System.Text; using System.IO; public partial class _Default : System.Web.UI.Page { protected void PageBlobButton_Click(object sender, EventArgs e) { //適当なUri string blobAddressUri = String.Format("text_aaaaaaaaaaaaaaaaaaaaaaaa.txt"); //Page Blobの参照を取得 var blob = blobContainer.GetPageBlobReference(blobAddressUri); //Page Blobを作成 //この処理をしないと、ストレージ内にBlobが生成されない blob.Create(512 * 4); //BlobStreamクラスを利用した書き込み try { blob.Metadata["Title"] = TitleTextBox.Text; var blobStream = blob.ToPageBlob.OpenWrite( new BlobRequestOptions() { BlobListingDetails = BlobListingDetails.All, UseFlatBlobListing = true }); blobStream.WriteByte(Convert.ToByte(PageBlobTextBox.Text)); blobStream.Commit(); } catch (Exception ex) { Debug.WriteLine(ex); } //CloudPageBlob.UploadText()メソッドを利用した書き込み try { blob.Metadata["Title"] = TitleTextBox.Text; blob.UploadText( PageBlobTextBox.Text, Encoding.UTF8, new BlobRequestOptions() { BlobListingDetails = BlobListingDetails.All, UseFlatBlobListing = true }); } catch (Exception ex) { Debug.WriteLine(ex); } //CloudPageBlob.WritePage()メソッドを利用した書き込み try { using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(PageBlobTextBox.Text))) { blob.WritePages(memoryStream, 0); memoryStream.Seek(0, SeekOrigin.Begin); blob.WritePages(memoryStream, 2 * PageBlobTextBox.Text.Length); } } catch (Exception ex) { Debug.WriteLine(ex); } } //(中略)
おまけ
Mackenzie Neilさんのブログにて、Block Blob、Page Blobへの処理が記述されています。こちらも参考にして頂けると幸いです。