我正在爲Windows Phone 7編寫一個應用程序,將圖像保存到獨立存儲中。 當我加載它們時,我無法關閉打開的圖像流,因爲我的程序的其他部分需要能夠讀取它們才能正確顯示圖像。 我只想在我準備在隔離存儲中刪除/更改文件本身時關閉這些流。刪除它們之前在IsolatedStorage中「關閉」文件
但是,當我準備好刪除這些圖像時,我不再有權訪問當我打開它們時使用的本地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。
請張貼您的代碼 - 您如何編寫這些文件? – Oded
通過保持流打開,您違背了IsolatedStorage(臨時和快速訪問)的基本原則。如果它是一個Win Forms應用程序(或者你將用完文件句柄),那麼你永遠不會考慮這麼做,那麼爲什麼它會在資源嚴重有限的設備上執行?您應該緩存位圖或根據需要重新打開流(大多數應用程序按需重新加載圖像,有些緩存一些經常使用的位圖):) –