本記事はWindows Phone Silverlightを使ったアプリケーション向けの開発Tipsです。WinRTアプリケーションでは使用することができない可能性があります。
Windows Phone 7アプリケーションでは、以前の様なExprolerを使って自由に閲覧・削除等のファイル操作が出来ません。では永続的にデータを保存するためにはどうすれば良いのかというと、「分離ストレージ(Isolated Storage)」と呼ばれる仕組みを利用します。
分離ストレージは、分離性と安全性を提供するデータストレージ機構です。ストレージへのアクセス権限を持たない他のアプリケーションからデータを保護する事が出来るようになり、ストレージの特定のパスを示す為のハードコーディングをする必要がなくなります。これにより悪意のあるアプリケーションからの不正アクセスや意図しないデータの汚染を防ぐことが出来ます。
キー値でのデータ保存と取得
IsolatedStorageSettingsクラスのApplicationSettingsプロパティを使用して、分離ストレージにキーと値のペアを格納します。ApplicationSettingsはアプリケーション毎の固有の設定になっています。コレクションになっているのでAddメソッドでキー値を追加するか、インデクサでキーを指定して値を設定するかで追加する事が出来ます。
using System.IO; using System.IO.IsolatedStorage; private void btnStoreKeyValue_Click(object sender, RoutedEventArgs e) { IsolatedStorageSettings store = IsolatedStorageSettings.ApplicationSettings; store["text"] = "こんにちは"; store.Save(); // ApplicationSettingsを保存する } private void btnLoadKeyValue_Click(object sender, RoutedEventArgs e) { IsolatedStorageSettings store = IsolatedStorageSettings.ApplicationSettings; if (store.Contains("text")) { textBox.Text = (string)store["text"]; } else { textBox.Text = "keyが見つかりませんでした"; } }
インデクサでのアクセスを行うと、キーが無かった場合に例外処理が発生しています。存在しないキーに対してのアクセスが頻繁に発生する場合は、TryGetValueメソッドを使用したほうが一般的に効率的と言われています。stringの部分は任意の型としてください。
string text = ""; if (store.TryGetValue<string>("text", out text)) { textBox.Text = text; }
ユーザーストアでのデータ保存と取得
アプリケーションIDに基づくユーザースコープに対応する分離ストレージを取得し、その分離ストレージに対してファイルを作成します。ストリームを使ってデータの保存と取得を行います。
using System.IO; using System.IO.IsolatedStorage; private void btnStoreFile_Click(object sender, RoutedEventArgs e) { var file = IsolatedStorageFile.GetUserStoreForApplication(); // 分離ストレージにtest.txtというファイルを作成しストリームを開く using (IsolatedStorageFileStream strm = file.CreateFile("test.txt")) using (StreamWriter writer = new StreamWriter(strm)) { // データを書き込む writer.Write("酢酸の実験室へようこそ!"); writer.Write("これはテストアプリです。"); } } private void btnLoadFile_Click(object sender, RoutedEventArgs e) { var file = IsolatedStorageFile.GetUserStoreForApplication(); // 分離ストレージ内のtest.txtというファイルを作成しストリームを開く using (IsolatedStorageFileStream strm = file.OpenFile("test.txt", FileMode.Open, FileAccess.Read)) using (var reader = new StreamReader(strm)) { textBox.Text = reader.ReadToEnd(); } }
分離ストレージに格納したデータの削除
分離ストレージに格納したデータの削除を行います。
ApplicationSettingsに格納でしたデータを削除するには、IsolatedStorageSettings.Clearメソッドにて削除を行った後にSaveメソッドを実行します。分離ストレージに格納された全てのディレクトリとファイルの削除を行うには、IsolatedStorageFile.Removeメソッドを使用します。
using System.IO; using System.IO.IsolatedStorage; private void btnDeleteStrage_Click(object sender, RoutedEventArgs e) { // ApplicationSettingsの削除 IsolatedStorageSettings store = IsolatedStorageSettings.ApplicationSettings; store.Clear(); store.Save(); // このアプリケーションのユーザーストア領域の削除 var file = IsolatedStorageFile.GetUserStoreForApplication(); file.Remove(); }
ストレージの空き容量の取得
ストレージの空き容量には制限は存在しないのですが、現実的に考えて無制限に使用するというわけにはいきません。大きなサイズのファイルをダウンロードする場合などは空き容量が気になります。AvailableFreeSpaceプロパティでユーザーが利用可能な空き容量が取得出来ます。
using System.IO; using System.IO.IsolatedStorage; private void btnFreeSpace_Click(object sender, RoutedEventArgs e) { var file = IsolatedStorageFile.GetUserStoreForApplication(); var spaceBytes = file.AvailableFreeSpace; var msg = string.Format( "空き容量は、{0:#,##0} Mbytesです。", spaceBytes / 1000000); MessageBox.Show(msg); }