2013-02-15 72 views
2
public static async Task SaveFileAsync(string FileName, T data) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 
     serializer.WriteObject(memStream, data); 

     StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName, 
      CreationCollisionOption.ReplaceExisting); 
     using (Stream stream = await file.OpenStreamForWriteAsync()) 
     { 
      memStream.Seek(0, SeekOrigin.Begin); 
      await memStream.CopyToAsync(stream); 
      await stream.FlushAsync(); 
     } 
    } 

    public static async Task<T> RestoreFileAsync(string FileName) 
    { 
     T result = default(T); 
     try 
     { 
      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(FileName); 
      using (IInputStream inStream = await file.OpenSequentialReadAsync()) 
      { 
       DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 
       result = (T)serializer.ReadObject(inStream.AsStreamForRead()); 
       return result; 
      } 
     } 

     catch (FileNotFoundException) 
     { 
      return default(T); 
     } 
    } 

我使用此代碼來保存和檢索我的數據,它工作正常。 有時我開始我的應用程序,並突然刪除所有數據,我真的不知道爲什麼。 我試過DataContractJsonSerializer並將它保存爲.txt文件,仍然是同樣的問題。 沒有異常或錯誤。 我也檢查過它自己的文件,.xml和.txt刪除所有內容。 其實我很困惑。winRT存儲文件問題

+0

您是否在unittests中看到過這種行爲?在我的場景中,他們總是得到一個新的本地文件夾內容被刪除後ApplicationData.Current.LocalFolder是否發生變化? 編寫簡單文本時有問題嗎? – 2013-02-17 12:09:44

+0

是本地文件夾在內容被刪除時發生更改,我沒有任何其他問題,沒有錯誤沒有例外,有時並不總是隻是刪除它。 – 2013-02-18 07:33:57

+0

挖掘周圍後,如果我改變了appxmanifest中的任何東西都會重新安裝,但這也不是問題。 我不斷測試應用程序,是否因爲我經常從Visual Studio不時運行應用程序? – 2013-02-18 07:37:08

回答

2

像這樣的問題通常是一個鎖定問題。當應用程序關閉並且生成的文件爲空時,您將打開該流。這是預料之中的。有時候,你會在多個單元測試中使用異步操作來創建競爭條件。這是預料之中的。你可以通過鎖定線程來解決這個問題。

閱讀這篇文章,看看它可以幫助你:http://blog.jerrynixon.com/2013/02/walkthrough-locking-asynchronous-file.html我真的很希望它。