- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 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