はじめに
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 の種類(テキストや画像など)に合わせたヘルパークラスを用意したほうが良いでしょう。