#setlinebreak(on);

[[WP TIPS に戻る>wp7/tips]]
*リソース/コンテンツを分離ストレージに保存する [#h4d2b481]
プロジェクトに画像などのデータを「リソース(Resource)もしくはコンテンツ」としてアセンブリに同梱し、その画像の URI を Image.Source に指定することで画像の表示などが出来ます。

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

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

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

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

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


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

**リソースから分離ストレージにコピーする [#ke173d70]
たとえば以下の画像のように、画像をプロジェクトに格納したとします。
|ファイル名|ビルドアクション|
|01.jpg|Resource|
|02.jpg|コンテンツ|
&br;
#ref(resource_save_to_isolatedstorage-01.jpg,nolink);
&br;

 // コピー先のフォルダを作成しておく
 // この場合は 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