2012-06-06 91 views
-1

我正在爲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。

+1

請張貼您的代碼 - 您如何編寫這些文件? – Oded

+0

通過保持流打開,您違背了IsolatedStorage(臨時和快速訪問)的基本原則。如果它是一個Win Forms應用程序(或者你將用完文件句柄),那麼你永遠不會考慮這麼做,那麼爲什麼它會在資源嚴重有限的設備上執行?您應該緩存位圖或根據需要重新打開流(大多數應用程序按需重新加載圖像,有些緩存一些經常使用的位圖):) –

回答

3

除非你處理海量數據大小,否則只要將它們加載到內存中,就應該關閉文件流。例如,如果您正在加載圖像,則應在創建圖像對象後關閉流。

+0

我需要流保持打開狀態,因爲我的程序的多個部分依賴於它們開放運作。相信我,我不希望它以這種方式工作,但這是它能夠工作的唯一方式。請回答我的實際問題,即如果有方法可以關閉文件而不訪問用於打開它們的原始流對象。 – WinterRye

+0

@WinterRye ...文件需要保持打開才能用作圖像......因爲它們必須完全加載到*內存位圖*中才可見。他們已經加載後可以關閉流。 –

+0

@WinterRye - 直接回答:沒有。間接回答:你有沒有考慮將數據加載到一個'MemoryStream'中,並將_that_作爲Stream傳遞? –