ホワイトペーパーが日本語化されたので、少しずつ試してます。
Download - Windows Azure Drive-February2010_jp.docx
Snapshot を取ってそれを CopyTo するような使い方をするらしい。
※ちなみに Windows Azure 関係の資料は日本語化が進んでますね!Windows Azure Services | Windows Azure
コード一部抜粋。Cloud Drive 読み書き出来た! - お だ のスペース で載せたコードに付け足してます。
protected void btnSnapshot_Click(object sender, EventArgs e)
{
this.CreateContainer();
StorageCredentialsAccountAndKey credentials =
new StorageCredentialsAccountAndKey("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");
try
{
int cacheSize = 20000;
Uri blobUri = new Uri("http://127.0.0.1:10000/devstoreaccount1/testpageblob/normal");
LocalResource localCache = RoleEnvironment.GetLocalResource("MyAzureDriveCache");
CloudDrive.InitializeCache(localCache.RootPath, localCache.MaximumSizeInMegabytes);
CloudDrive drive = new CloudDrive(blobUri, credentials);
var snapshotUri = drive.Snapshot();
this.lblSnapshotUri.Text = snapshotUri.ToString();
CloudDrive snapshotDrive = new CloudDrive(snapshotUri, credentials);
string driveLetter = snapshotDrive.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;
}
}
protected void btnSnapshotWrite_Click(object sender, EventArgs e)
{
this.CreateContainer();
StorageCredentialsAccountAndKey credentials =
new StorageCredentialsAccountAndKey("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");
try
{
int cacheSize = 20000;
Uri blobUri = new Uri(this.lblSnapshotUri.Text);
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 (StreamWriter writer = new StreamWriter(driveLetter + "//hoge.txt"))
{
writer.Write(this.txtContent.Text);
}
using (StreamReader reader = new StreamReader(driveLetter + "//hoge.txt"))
{
this.lblContent.Text = reader.ReadToEnd();
}
}
catch (CloudDriveException ex)
{
Debug.WriteLine(ex.StackTrace);
throw;
}
}
protected void btnCopy_Click(object sender, EventArgs e)
{
this.CreateContainer();
StorageCredentialsAccountAndKey credentials =
new StorageCredentialsAccountAndKey("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");
try
{
int cacheSize = 20000;
Uri blobUri = new Uri(this.lblSnapshotUri.Text);
LocalResource localCache = RoleEnvironment.GetLocalResource("MyAzureDriveCache");
CloudDrive.InitializeCache(localCache.RootPath, localCache.MaximumSizeInMegabytes);
CloudDrive drive = new CloudDrive(blobUri, credentials);
var copyUri = new Uri("http://127.0.0.1:10000/devstoreaccount1/testpageblob/" + this.txtCopyUri.Text);
drive.CopyTo(copyUri);
CloudDrive snapshotDrive = new CloudDrive(copyUri, credentials);
string driveLetter = snapshotDrive.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;
}
}
protected void btnCopyWrite_Click(object sender, EventArgs e)
{
this.CreateContainer();
StorageCredentialsAccountAndKey credentials =
new StorageCredentialsAccountAndKey("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");
try
{
int cacheSize = 20000;
Uri blobUri = new Uri("http://127.0.0.1:10000/devstoreaccount1/testpageblob/" + this.txtCopyUri.Text);
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 (StreamWriter writer = new StreamWriter(driveLetter + "//hoge.txt"))
{
writer.Write(this.txtContent.Text);
}
using (StreamReader reader = new StreamReader(driveLetter + "//hoge.txt"))
{
this.lblContent.Text = reader.ReadToEnd();
}
}
catch (CloudDriveException ex)
{
Debug.WriteLine(ex.StackTrace);
throw;
}
}
Snapshot について思ったこと
- URL は、Snapshot を取った Uri に ?snapshot=日時 を付加したみたいな感じでした。
http://127.0.0.1:10000/devstoreaccount1/testpageblob/normal?snapshot=2010-03-01T12:32:35.8660000Z
- 読取専用だと思ってたんだけど、マウントしたら書き込み出来てしまった。あれ読取専用じゃなかったっけ?
あとどういう条件かはわかってないんですが、時々 ERROR_LEASE_LOCKED ってエラーがでる。もう少し検証 + ホワイトペーパーをちゃんと読まないとダメだな。