8

我有一個孤立的存儲問題。在IsolatedStorageFileStream上不允許操作。錯誤

這是我的代碼:

List<Notes> data = new List<Notes>(); 

using (IsolatedStorageFile isoStore = 
     IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    using (IsolatedStorageFileStream isoStream = 
      isoStore.OpenFile("Notes.xml", FileMode.OpenOrCreate)) 
    { 
    XmlSerializer serializer = new XmlSerializer(typeof(List<Notes>)); 
    data = (List<Notes>)serializer.Deserialize(isoStream);    
    } 
} 

data.Add(new Notes() { Note = "hai", DT = "Friday" }); 

return data; 

錯誤:操作不IsolatedStorageFileStream不允許的。在

using (IsolatedStorageFileStream isoStream = 
     isoStore.OpenFile("Notes.xml", FileMode.OpenOrCreate)) 

回答

16

這通常發生在您同時執行多次代碼塊時。你最終鎖定文件。所以,你必須確保你包括在構造函數的FileAccess和文件共享模式是這樣的:

using (var isoStream = new IsolatedStorageFileStream("Notes.xml", FileMode.Open, FileAccess.Read, FileShare.Read, isolatedStorage) 
{ 
//... 
} 

如果你想寫入,而其他正在閱讀的文件,那麼你需要同步鎖定這樣的:

private readonly object _readLock = new object(); 

lock(_readLock) 
{ 
    using (var isoStream = new IsolatedStorageFileStream("Notes.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, isolatedStorage) 
    { 
     //... 
    } 
} 
+0

這個答案也適用於windows phone 8。謝謝。 –

0

與IsolatedStorageFileStream構造函數替換using語句內:

using (var isoStream = new IsolatedStorageFileStream("Notes.xml", FileMode.Open, isoStore)) 

而且,因爲你從文件中讀取,我想你想的fileMode是開放的,不OpenOrCreate。

在哪裏 '數據' 被分配,可以考慮使用

serializer.Deserialize(isoStream) as List<Notes> 

代替。見Effective C#第2版中的第3項。

+0

爲您的建議播放媒體我改變是:數據= serializer.Deserializer(isoStream)的列表,但我到了那裏是XML文檔中的錯誤新的問題(0,0)。 – yozawiratama

+0

聽起來好像你以前沒有寫過這個IsolatedStorageFile,那是對的嗎?無論是您的應用程序的業務邏輯應該保證該文件先前已被寫入,或者您應該檢查該文件的存在,然後再嘗試讀取它。使用與讀取文件類似的結構編寫文件,但調用Serialize而不是Deserialize,並使用FileMode.OpenOrCreate。 –

-1

IsolatedStorageFileStream不允許操作。將文件從共享文件移動到目標時發生錯誤。其工作

添加命名空間

using BackgroundProcess.Resources; 
using Microsoft.Phone.BackgroundTransfer; 
using System.IO.IsolatedStorage; 

創建獨立存儲

BackgroundTransferRequest transfer; 
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication()) 

{ 

     if (isoStore.GetDirectoryNames("DestinationFolder").Length == 0) 
      isoStore.CreateDirectory("DestinationFolder"); 

     storage.MoveFile("/shared/transfers/xyzFileName.mp3", "DestinationFolder"); 

} 

一個目標目錄,或使用

isoStore.MoveFile(transfer.DownloadLocation.OriginalString, "DestinationFolder"); 

而不是添加文件名的目的地添加文件夾名的。

您可以通過下面的代碼

try 
{ 
     string isoFileName = "DestinationFolder//xyzFileName.mp3"; 

     StorageFile file = null; 

     try 
     { 
      file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/" + isoFileName)); 
     } 
     catch (Exception ex) 
     { 
     } 
     if (file != null) 
      await Windows.System.Launcher.LaunchFileAsync(file); 
    } 
    catch (Exception ex) 
    { 
    } 
相關問題