【发布时间】:2012-10-24 08:32:28
【问题描述】:
我正在开发 Windows 8 XAML/C# 商店应用程序。我试图在应用程序的生命周期内多次从Windows.Storage.ApplicationData.Current.LocalFolder 加载 XML 到XDocument。但是,当我尝试加载文件时收到System.UnauthorizedAccessException。这是我的方法:
添加到 XML:
private async void AddCategoryButton_Click(object sender, RoutedEventArgs e)
{
XDocument CategoryListXDoc = await LoadXmlFromLocalFolderAsync("Categories.xml");
CategoryListXDoc.Element("CategoryList").Add(
new XElement("Category", new XAttribute("Id", Guid.NewGuid()), AddCategoryTextBox.Text));
SaveXDocToLocalFolderAsync("Categories.xml", CategoryListXDoc);
}
仅用于调试目的:
private async void Button_Click_2(object sender, RoutedEventArgs e)
{
XDocument TempXDoc = await LoadXmlFromLocalFolderAsync("Categories.xml");
Debug.WriteLine(TempXDoc);
}
加载和保存方法:
private async Task<XDocument> LoadXmlFromLocalFolderAsync(string FileName)
{
var LocalFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFile CategoryListFile = await LocalFolder.GetFileAsync(FileName);
var stream = await CategoryListFile.OpenStreamForReadAsync() as Stream;
XDocument TempXDoc = XDocument.Load(stream);
stream.Flush();
return TempXDoc;
}
private async void SaveXDocToLocalFolderAsync(string Filename, XDocument XDocToSave)
{
var LocalFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFile CategoryListFile = await LocalFolder.CreateFileAsync(Filename, CreationCollisionOption.ReplaceExisting);
var stream = await CategoryListFile.OpenStreamForWriteAsync() as Stream;
XDocToSave.Save(stream);
stream.Flush();
}
如果我反复触发Click 事件,则会引发异常。没有具体的场景。有时会发生错误,有时不会。我哪里错了?我对async 和await 的东西很陌生。
【问题讨论】:
-
那么,如果您只是导航到您能够读取文件的文件夹?
-
您对该文件夹或文件的权限是多少,您是否以管理员模式启动了 VS?
-
Click事件一个接一个发生得很快?可能是两个LoadXmlFromLocalFolderAsync正在同时执行,或者与另一个线程尝试使用文件时文件被一个线程持有的事实有关。 -
@CoralDoe 我的想法是一样的。如果我快速触发事件,肯定会发生错误。有什么解决办法吗? @Larry 应该不是问题。我正在使用推荐用于沙盒本地和漫游存储的应用程序 AppData 文件夹。此外,它有时确实能够访问该文件。 @awright18 无意冒犯,但您是否错过了
StorageFile创作的路线?
标签: c# windows-8 microsoft-metro linq-to-xml