- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- wp7/tips/resource_save_to_isolatedstorage へ行く。
- 1 (2011-12-03 (土) 21:49:12)
- 2 (2011-12-03 (土) 22:21:00)
リソース/コンテンツを分離ストレージに保存する
プロジェクトに画像などのデータを「リソース(Resource)もしくはコンテンツ」としてアセンブリに同梱し、その画像の URI を Image.Source に指定することで画像の表示などが出来ます。
参照
ビルドアクション リソース/コンテンツ URI の指定方法
Image.Source 等で URI を指定することで読み込みが出来るのでファイルと同じように Stream で読み込めると思いきや、そうではないので注意が必要です。
というのも WP7 では(Silverlight では)、アプリが独自に読み書きできるストレージ領域は「分離ストレージ」というアプリ個別に割り当てられたストレージエリアを使用することが出来ます。
WPF や WinForm のように HDD 全領域にアクセスできるのではなく、そのアプリ用に用意されたストレージエリアでこの内部であれば自由にファイルやフォルダの作成・削除が可能です。
で、ここで混乱するのが「プロジェクトに格納した画像を "コンテンツ" にしても」ファイルは分離ストレージに格納されるわけでは無いと言うこ
とです。
というわけで「プロジェクトに格納したテキストファイルを、別途プログラム中で読み込みたい」という場合は、そのファイルを別途リソースエリアから分離ストレージにコピーする必要があります。
リソースから分離ストレージにコピーする
たとえば以下の画像のように、画像をプロジェクトに格納したとします。
| ファイル名 | ビルドアクション |
| 01.jpg | Resource |
| 02.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


