BlobStorage お試し

はじめに

StorageClient ライブラリで提供されるクラスを使って、Windows Azure Storage Service の Blob を試してみました。といっても、先日同様 Development Storage ですけど(;^_^A

下準備

コード
// 構成ファイルからアカウント情報を取得
StorageAccountInfo account = StorageAccountInfo.GetDefaultBlobStorageAccountFromConfiguration();

// Blob にアクセスするオブジェクトを作成
BlobStorage blobStorage = BlobStorage.Create(account);
blobStorage.RetryPolicy = RetryPolicies.RetryN(2, TimeSpan.FromMilliseconds(100));

BlobContainer を作成

コード
// 構成ファイルからコンテナの名前を取得
string containerName = StorageAccountInfo.GetConfigurationSetting("ContainerName", null, true);

// コンテナのメタデータを作成
NameValueCollection containerMetadata = new NameValueCollection();
containerMetadata.Add("Name", "StorageSample");

// Blob のコンテナを取得(存在しない場合は作成)
BlobContainer container = blobStorage.GetBlobContainer(containerName);
container.CreateContainer(containerMetadata, ContainerAccessControl.Private);

コンテナのプロパティを取得して表示

コード
// コンテナのプロパティを取得して表示
ContainerProperties containerProperties = container.GetContainerProperties();
Console.WriteLine("Name:{0}", containerProperties.Name);
Console.WriteLine("LastModified:{0}", containerProperties.LastModifiedTime);
Console.WriteLine("ETag:{0}", containerProperties.ETag);
実行結果
Name:storagesamplecontainer
LastModified:2009/01/27 8:16:07
ETag:0x8CB4E6EA3BD5E49

コンテナのアクセスコントロールを取得して表示

コード
// コンテナのアクセスコントロールを取得して表示
ContainerAccessControl acl = container.GetContainerAccessControl();
Console.WriteLine("AccessControl:{0}", acl);
実行結果
AccessControl:Private

コンテナに新たに Blob を追加

コード
// 作成する Blob のメタデータを用意
NameValueCollection nv1 = new NameValueCollection();
nv1["m1"] = "v1";
nv1["m2"] = "v2";

// 作成する Blob のプロパティを設定
BlobProperties blob = new BlobProperties("sample.txt");
blob.ContentType = new ContentType("text/plain; charset=UTF-8").ToString();
blob.Metadata = nv1;    // メタデータをセット

// sample.txt の内容
string value = "Hello Blob";

// コンテナに Blob を作成する
container.CreateBlob(blob, new BlobContents(Encoding.UTF8.GetBytes(value)), true);

// コンテナから Blob のプロパティを取得
BlobProperties prop = container.GetBlobProperties("sample.txt");
Console.WriteLine("sample.txt content length = " + prop.ContentLength);
実行結果
sample.txt content length = 10

コンテナから Blob を取り出す

コード
// コンテナから Blob を取り出す
BlobContents contents = new BlobContents(new MemoryStream());
BlobProperties blob2 = container.GetBlob("sample.txt", contents, false);

// sample.txt の中身を取得する
string value2 = Encoding.UTF8.GetString(contents.AsBytes());

// sample.txt の中身を出力する
Console.WriteLine("Value = " + value2);

// Blob のメタデータを出力する
Console.Write("Metadata = ");
bool first = true;
foreach (string key in blob2.Metadata.Keys)
{
    if (!first) Console.Write(";");
    first = false;
    Console.Write("{0}={1}", key, blob2.Metadata[key]);
}
実行結果
Value = Hello Blob
Metadata = m1=v1;m2=v2

Blob のメタデータを更新する

コード
// Blob のプロパティを取得する
BlobContents contents3 = new BlobContents(new MemoryStream());
BlobProperties blob3 = container.GetBlob("sample.txt", contents3, false);

// メタデータを追加
blob3.Metadata["m3"] = "v3";

// 変更内容を保存する
container.UpdateBlobMetadata(blob3);

Blob に保存されてるデータを更新する

コード
// Blob のプロパティを取得する
BlobContents contents4 = new BlobContents(new MemoryStream());
BlobProperties blob4 = container.GetBlob("sample.txt", contents4, false);

// sample.txt の中身を Hello Again Blob に変更
container.UpdateBlobIfNotModified(blob4,
    new BlobContents(Encoding.UTF8.GetBytes("Hello Again Blob")));

コンテナから Blob を削除する

コード
container.DeleteBlob("sample.txt");

コンテナを削除する

コード
container.DeleteContainer();

まとめ

Blob の作成や取得を行うには、多くのクラスを利用する必要があり、頻雑ですね。Blob の種類(テキストや画像など)に合わせたヘルパークラスを用意したほうが良いでしょう。

関連記事