画像を分離ストレージに保存する Windows Phone 7 用のアプリを作成しています。それらをロードすると、開いている画像ストリームを閉じることができません。画像を適切に表示するために、プログラムの他の部分がそれらを読み取れるようにする必要があるためです。これらのストリームを閉じたいのは、分離ストレージ内のファイル自体を削除または変更する準備ができているときだけです。
しかし、これらの画像を削除する準備が整う頃には、画像を開いたときに使用していたローカルの IsolatedStorageFileStream 変数にアクセスできなくなりました。
この時点でこれらのファイルを何らかの形で「閉じる」方法はありますか (アプリケーションを再起動する以外に)? そうしないと削除できないようです。
これは、画像を IsolatedStorage に書き込む方法です。
Dictionary<string, Stream> imageDict = (Dictionary<string, Stream>)Globals.CNState["ATTACHMENT"];
foreach (string pic in imageDict.Keys)
{
Stream input = imageDict[pic];
input.Position = 0;
byte[] buffer = new byte[16*1024];
using (FileStream thisStream = myISF.OpenFile(thisDirectory + pic, FileMode.Create))
{
int read = input.Read(buffer, 0, buffer.Length);
while (read > 0)
{
thisStream.Write(buffer, 0, read);
read = input.Read(buffer, 0, buffer.Length);
}
}
}
これは、後でそれらをロードする方法です (ご覧のとおり、開いたままにします)。
string[] storedImages = myISF.GetFileNames(thisDirectory);
if(storedImages.Length > 0)
{
foreach(string pic in storedImages)
{
IsolatedStorageFileStream imageStream = myISF.OpenFile(thisDirectory + pic, FileMode.Open, FileAccess.Read, FileShare.Read);
imageDict.Add(pic, imageStream);
}
}
Globals.CNState["ATTACHMENT"] = imageDict;
アプリケーションの別の部分がファイル ストリームから画像を作成する必要があるため、これらを閉じることができません (これは複数回発生する必要がある場合があります)。
if (Globals.CNState != null && Globals.CNState.ContainsKey("ATTACHMENT"))
{
imageDict = (Dictionary<string, Stream>)Globals.CNState["ATTACHMENT"];
foreach (string key in imageDict.Keys)
{
Stream imageStream = imageDict[key];
Image pic = new Image();
pic.Tag = key;
BitmapImage bmp = new BitmapImage();
bmp.SetSource(imageStream);
pic.Source = bmp;
pic.Margin = new Thickness(0, 0, 0, 15);
pic.MouseLeftButtonUp += new MouseButtonEventHandler(pic_MouseLeftButtonUp);
DisplayPanel.Children.Add(pic);
}
}
また、プログラムの別の部分がこれらの画像をサーバーに送信するため、ストリームを開いたままにしておく必要があります。私の知る限り、UIElement ではなくバイト ストリームしか送信できません。