Cloud Drive 読み書き出来た!
CloudDrive 少し進んだ! - お だ のスペース のさらに続きです。
ファイルの読み書きが出来たので、晒します。
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebRole1._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="txtContent" runat="server" /> <br /> <asp:Button ID="btnWrite" runat="server" Text="Write" onclick="btnWrite_Click" /> <br /> <asp:Button ID="btnRead" runat="server" Text="Read" onclick="btnRead_Click" /> <br /> <asp:Label ID="lblContent" runat="server" /> </div> </form> </body> </html>Default.aspx.cs
using System; using System.Diagnostics; using System.IO; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.ServiceRuntime; using Microsoft.WindowsAzure.StorageClient; namespace WebRole1 { public partial class _Default : System.Web.UI.Page { // CloudDrive を Create したかの判断に使用する。暫定処置 static bool isCreate = false; protected void Page_Load(object sender, EventArgs e) { this.lblContent.Text = ""; } private void CreateContainer() { // *.cscfg 設定ファイルからストレージ・アクセスの情報を取得 var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); // ブロブ・ストレージ・アカウントの作成 CloudBlobClient blobStorage = storageAccount.CreateCloudBlobClient(); // コンテナが存在しない場合は作成 CloudBlobContainer blobContainer = blobStorage.GetContainerReference("testpageblob"); blobContainer.CreateIfNotExist(); } protected void btnWrite_Click(object sender, EventArgs e) { this.CreateContainer(); // 各自の環境に合わせて StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey("<AccountName>", "<AccountKey>"); try { int driveSize = 20000; int cacheSize = 20000; // 作成したBlobコンテナを指定。<BlobName> は自由に。但し、blobUri に対して CloudDrive.Create は一度だけ呼ぶ。 Uri blobUri = new Uri("http://<AccountName>.blob.core.windows.net/testpageblob/<BlobName>"); // .csdef に定義した LocalResources の LocalStorage を指定 LocalResource localCache = RoleEnvironment.GetLocalResource("MyAzureDriveCache"); // 必ず呼ぶこと! CloudDrive.InitializeCache(localCache.RootPath, localCache.MaximumSizeInMegabytes); CloudDrive drive = new CloudDrive(blobUri, credentials); // Create は一回だけでよい。二回目以降は例外が出る! // Create済か判断するメソッドやプロパティは未だ見つけられず… if (!isCreate) { drive.Create(driveSize); isCreate = true; } string driveLetter = drive.Mount(cacheSize, DriveMountOptions.None); using (StreamWriter writer = new StreamWriter(driveLetter + "//hoge.txt")) { writer.Write(this.txtContent.Text); } } catch (CloudDriveException ex) { Debug.WriteLine(ex.StackTrace); throw; } } protected void btnRead_Click(object sender, EventArgs e) { this.CreateContainer(); // 各自の環境に合わせて StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey("<AccountName>", "<AccountKey>"); try { int cacheSize = 20000; Uri blobUri = new Uri("http://<AccountName>.blob.core.windows.net/testpageblob/<BlobName>"); LocalResource localCache = RoleEnvironment.GetLocalResource("MyAzureDriveCache"); CloudDrive.InitializeCache(localCache.RootPath, localCache.MaximumSizeInMegabytes); CloudDrive drive = new CloudDrive(blobUri, credentials); string driveLetter = drive.Mount(cacheSize, DriveMountOptions.None); using (StreamReader reader = new StreamReader(driveLetter + "//hoge.txt")) { this.lblContent.Text = reader.ReadToEnd(); } } catch (CloudDriveException ex) { Debug.WriteLine(ex.StackTrace); throw; } } } }
Write ボタンを押したら、TextBox に入力されている内容を hoge.txt に出力し、Read ボタンを押したら、hoge.txt の内容を Label に出力するだけのコードです。
普通に StreamWriter や StreamReader でファイルの読み書きが出来てますね!!
注意点が幾つかあります。
2010/02/23 追記
開発ストレージ (Development Storage) では動かないと書きましたが、再度試したところ問題無く動きました。誤情報を書いてしまい申し訳ありません。
・前回も書きましたが、開発ストレージ(Development Storage)ではうまく動かないみたいです。※体験談なので、公式の情報を見つけてません。
以降は、ホワイトペーパーの 8.6 Troubleshooting に記載されていました。
Using the Windows Azure Storage Services の Windows Azure Drives white paper.Windows Azure Drives white paper.
・CloudDrive.Create は BlobURI に対して 1回だけ呼び出すこと。Create済の状態で CloudDrive.Create を呼び出すとエラーになります。
・CloudDrive.InitializeCache を必ず呼ぶこと。呼ばないとエラーになります。
・Development Fabric が動いていないとエラーになる。※これは、試してません。単なる Console アプリ等からは使用出来ないのかな?