WP TIPS に戻る

リソース/コンテンツを分離ストレージに保存する

プロジェクトに画像などのデータを「リソース(Resource)もしくはコンテンツ」としてアセンブリに同梱し、その画像の URI を Image.Source に指定することで画像の表示などが出来ます。

参照
ビルドアクション リソース/コンテンツ URI の指定方法

Image.Source 等で URI を指定することで読み込みが出来るのでファイルと同じように Stream で読み込めると思いきや、そうではないので注意が必要です。

というのも WP7 では(Silverlight では)、アプリが独自に読み書きできるストレージ領域は「分離ストレージ」というアプリ個別に割り当てられたストレージエリアを使用することが出来ます。

WPF や WinForm のように HDD 全領域にアクセスできるのではなく、そのアプリ用に用意されたストレージエリアでこの内部であれば自由にファイルやフォルダの作成・削除が可能です。

で、ここで混乱するのが「プロジェクトに格納した画像を "コンテンツ" にしても」ファイルは分離ストレージに格納されるわけでは無いと言うこ
とです。

というわけで「プロジェクトに格納したテキストファイルを、別途プログラム中で読み込みたい」という場合は、そのファイルを別途リソースエリアから分離ストレージにコピーする必要があります。

リソースから分離ストレージにコピーする

たとえば以下の画像のように、画像をプロジェクトに格納したとします。

ファイル名ビルドアクション
01.jpgResource
02.jpgコンテンツ


resource_save_to_isolatedstorage-01.jpg


// コピー先のフォルダを作成しておく
// この場合は Image フォルダ

// リソースから分離ストレージにコピーする
ResourceToFile(@"/AssemblyName;component/Contents/Image/01.jpg", "Image/01.jpg");
ResourceToFile(@"Contents/Image/02.jpg", "Image/02.jpg");

// リソースから分離ストレージにコピーするメソッド
public static void ResourceToFile(string respath, string dst)
{
   // リソースのストリームを開く
   StreamResourceInfo resource = Application.GetResourceStream(new Uri(respath, UriKind.Relative));
       
   // コピー用のバッファを準備する
   byte[] bytes = new byte[resource.Stream.Length];
   
   // リソースから読み取る
   resource.Stream.Read(bytes, 0, bytes.Length);
   
   // ファイルに出力する
   using (IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication())
   {
       using (IsolatedStorageFileStream stream = iso.CreateFile(dst))
       {
           stream.Write(bytes, 0, bytes.Length);
       }
   }
}

Rx を使ってないのはご愛敬と言うことで。

参照
分離ストレージ
http://msdn.microsoft.com/ja-jp/library/3ak841sy.aspx