酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Phoneで分離ストレージ(Isolated Storage)を使ってデータの保存と取得を行う

本記事は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);
}