雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

わんくま東京勉強会 #64 アフターフォロー (13) : ローカルストレージ - IsolatedStorage

State は揮発性の領域のため永続的なデータの保管先としては利用出来ません。
端末へ永続データを保管する場合は IsolatedStorage を使用します。
この領域に保存されたデータはアプリケーションを終了しても消える事はありません。保存したデータが不要となった場合は、保存したアプリケーションが責任を持って削除する必要があります。
なお、この領域は各アプリケーションに閉じたものとなっており、他のアプリケーションから保存されたデータにアクセスする事は出来ません。

データの格納方法

IsolatedStorage にデータを格納する際は、 System.IO.IsolatedStorage.IsolatedStorageSettings クラスの ApplicationSettings プロパティを使用します。
ApplicationSettings プロパティは Dictionary になっているので、インデクサを使用して格納します。

IsolatedStorageSettings.ApplicationSettings["Key"] = value;

値の取得方法

格納時と同様にインデクサを使用します。

int value = 0;
if (IsolatedStorageSettings.ApplicationSettings.ContainsKey("Key"))
{
  value = (int)IsolatedStorageSettings.ApplicationSettings["Key"];
}

値は object 型で取得されるので、必要に応じて型変換してください。

ファイルの保存

IsolatedStorage にはファイルを保存する事も出来ます。

ファイルの格納方法

ファイルの格納は System.IO.IsolatedStorage.IsolatedStorageFile クラスの GetUserStoreForApplication メソッドを使用して IsolatedStorage へのアクセサを取得し、 CreateFile メソッドで書き込みます。
以下は、 Image オブジェクトを格納する例です。

// Bitmap image
var writer = new WriteableBitmap(image);
using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
  using (var stream = storage.CreateFile("ファイル名"))
  {
    writer.SaveJpeg(stream, writer.PixelWidth, writer.PixelHeight, 0, 100);
  }
}
ファイルの取り出し方法

IsolatedStorage に格納したファイルを取り出す場合は OpenFile メソッドを使用します。

var image = new BitmapImage();
using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
  using (var stream = storage.OpenFile("ファイル名", FileMode.Open))
  {
    image.SetSource(stream);
  }
}

ディレクトリの作成

IsolatedStorage にファイルを格納する際、階層を作る事が出来ます。
※ここで作成した階層はあくまでも作成したアプリケーション内のみで有効です。

using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
  storage.CreateDirectory("ディレクトリ名");
}

作成したディレクトリ配下のファイルにアクセスする際は、ファイル名をパス付きで指定します。

ファイル格納時
// Bitmap image
var writer = new WriteableBitmap(image);
using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
  using (var stream = storage.CreateFile("ディレクトリ名\\ファイル名"))
  {
    writer.SaveJpeg(stream, writer.PixelWidth, writer.PixelHeight, 0, 100);
  }
}
ファイル取り出し時
var image = new BitmapImage();
using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
  using (var stream = storage.OpenFile("ディレクトリ名\\ファイル名", FileMode.Open))
  {
    image.SetSource(stream);
  }
}

ディレクトリの削除

作成済みのディレクトリは DeleteDirectory メソッドで削除します。

using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
{
  storage.DeleteDirectory("ディレクトリ名");
}

ディレクトリを削除する際は、予めディレクトリ内のファイルをすべて削除しておく必要があるので注意してください。