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 ServicesWindows Azure Drives white paper.Windows Azure Drives white paper.
・CloudDrive.Create は BlobURI に対して 1回だけ呼び出すこと。Create済の状態で CloudDrive.Create を呼び出すとエラーになります。
・CloudDrive.InitializeCache を必ず呼ぶこと。呼ばないとエラーになります。
・Development Fabric が動いていないとエラーになる。※これは、試してません。単なる Console アプリ等からは使用出来ないのかな?