1

當我嘗試在Windows Phone上保存列表時,出現「System.UnauthorizedAccessException:訪問被拒絕。」消息。System.UnauthorizedAccessException:訪問被拒絕。 Windows Phone在使用文件時

場景:

當在FavoriteButton點擊後,系統會檢查,如果該項目已經是人們喜愛。

下一步是調用Load方法。這將返回一個包含收藏夾的列表。

當項目最喜歡我會從列表中刪除它,否則我會添加它。

最後一步是使用我的Save方法保存新列表。

執行此代碼時,我得到以下異常:

System.UnauthorizedAccessException的:訪問被拒絕。 (異常來自HRESULT:0X80070005(E_ACCESSDENIED

我環顧四周,發現它可能是清單的功能,所以我必須檢查了所有的只是要確定再次嘗試我仍然得到異常後

。!

必須我該怎麼辦代碼如下:?

 private async void favoriteClicked(object sender, EventArgs e) 
    { 
     if (_progressIndicator.IsVisible == false) 
     { 
      try 
      { 
       Boolean isFavorite = Settings.GetValueOrDefault<Boolean>(currentArtist.id, false); 
       ArtistSaving favorite = new ArtistSaving(currentArtist.id, currentArtist.name, currentArtist.shortBio); 
       artistList = await Task.Run(() => Utils.Load<ArtistSaving>()); 
       if (isFavorite == true) 
       { 
        artistList.Remove(favorite); 
        displayDeletePopup(); 
        Settings.AddOrUpdateValue(currentArtist.id, false); 
        await Task.Run(() => Utils.Save<ArtistSaving>(artistList)); 
       } 
       else 
       { 
        artistList.Add(favorite); 
        displayXamlPopup(); 
        Settings.AddOrUpdateValue(currentArtist.id, true); 
        await Task.Run(() => Utils.Save<ArtistSaving>(artistList)); 
       } 
      } 
      catch (ArgumentException ex) 
      { 

      } 
     } 
    } 

收藏夾按鈕點擊

public static async Task<ObservableCollection<T>> Load<T>() 
    { 
     // Create a new folder name DataFolder. 
     var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(JSONFILENAME, 
     CreationCollisionOption.OpenIfExists); 

     var jsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<T>)); 

     var myStream = await file.OpenStreamForReadAsync(); 

     ObservableCollection<T> myObj = (ObservableCollection<T>)jsonSerializer.ReadObject(myStream); 

     if (myObj == null) 
     { 
      return new ObservableCollection<T>(); 
     } 
     return myObj; 
    } 

這是Load方法

public static async void Save<T>(ObservableCollection<T> obj) 
    { 
     var serializer = new DataContractJsonSerializer(typeof(ObservableCollection<T>)); 

     using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(
      JSONFILENAME, CreationCollisionOption.ReplaceExisting)) 
     { 
      serializer.WriteObject(stream, obj); 
     } 
    } 

,這是保存方法

編輯 - 解決方案:從當你從它讀

public static async Task<ObservableCollection<T>> Load<T>() 
    { 
     ObservableCollection<T> myObj = null; 
     // Create a new folder name DataFolder. 
     var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(JSONFILENAME, 
     CreationCollisionOption.OpenIfExists); 

     var jsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<T>)); 

     using (var myStream = await file.OpenStreamForReadAsync()) 
     { 
      myObj = (ObservableCollection<T>)jsonSerializer.ReadObject(myStream); 
      if (myObj == null) 
      { 
       return new ObservableCollection<T>(); 
      } 
      return myObj; 
     } 


    } 
+0

沒有必要使用「isFavorite == true」。 isFavorite已經是一個布爾值,所以你可以使用if(isFavorite)。 – Fabio 2015-02-24 17:27:09

+0

多數民衆贊成是真的,謝謝;) – 2015-02-24 17:28:35

回答

4

最有可能的文件仍鎖定。像這樣修改Load方法以釋放文件鎖:

using (var myStream = await file.OpenStreamForReadAsync()) 
{ 
    ObservableCollection<T> myObj = (ObservableCollection<T>)jsonSerializer.ReadObject(myStream); 
} 
+0

你先生是一個天才!這個竅門!用解決方案更新我的問題。非常感謝,你能解釋爲什麼這個「使用」正在做什麼? – 2015-02-24 21:59:25

+3

當然可以! Stream類繼承自IDisposable。這意味着一旦對象被構建,它就會一直存在,直到調用Dispose()方法。 using方法將自動調用Dispose()方法,這會導致對象超出範圍並釋放資源。查看[鏈接](https://msdn.microsoft.com/en-us/library/system.idisposable(v = vs.110).aspx),瞭解Disposable對象存在的原因。 – Ryan 2015-02-24 22:04:26

+0

輝煌!在我們說話時學習。謝謝您的幫助。 – 2015-02-24 22:06:57