WinRT -添加新的项目到XML和访问拒绝
本文关键字:XML 访问 拒绝 项目 添加 WinRT | 更新日期: 2023-09-27 18:03:36
有一个简单的任务应用程序。我有taskTextBox, addButton和tasksListView,其中显示任务。我用这种方式向XML文件添加新项目:
private async void addButton_Click_1(object sender, RoutedEventArgs e)
{
try
{
var folder = ApplicationData.Current.LocalFolder;
var file = await folder.GetFileAsync("tasks.xml");
var readStream = await FileIO.ReadTextAsync(file);
var writeStream = await file.OpenStreamForWriteAsync();
XElement xElem = XElement.Parse(readStream);
xElem.Add(new XElement("Task",
new XElement("Id", Guid.NewGuid()),
new XElement("Name", QuickTaskTextBox.Text.ToString())
));
xElem.Save(writeStream);
taskTextBox.Text = "";
}
catch (Exception ex)
{
new MessageDialog(ex.Message).ShowAsync();
}
finally
{
this.Frame.Navigate(typeof(MyTasks));
}
}
但是当我点击addButton然后应用程序抛出异常访问拒绝HRESULT: 0x80070005 (E_ACCESSDENIED)
它是由this.Frame.Navigate(typeof(MyTasks))引起的;当我删除这段代码,然后一切看起来OK,只有ListView不包含我的新添加的任务。
您可能应该更改页面,以便它不会导航到自己。
但是,暂时忽略它,您还有另一个问题。您永远不会显式关闭文件。这意味着,如果页面导航到自身的速度足够快,那么您试图打开的文件仍然是打开的。这会导致访问被拒绝错误。要解决这个问题,您需要将writeStream
的使用包装在using
语句中:
var readStream = await FileIO.ReadTextAsync(file);
using (var writeStream = await file.OpenStreamForWriteAsync())
{
XElement xElem = XElement.Parse(readStream);
xElem.Add(new XElement("Task",
new XElement("Id", Guid.NewGuid()),
new XElement("Name", QuickTaskTextBox.Text.ToString())
));
xElem.Save(writeStream);
}
从你的描述,这听起来像这都是一个页面(即,你的代码出现在页面MyTasks
),你从页面导航回到自己?我本以为这本身就是一个问题,但至少在我看来,这是一个简单的例子。所以我不确定在哪里抛出异常,除非你的OnNavigatedTo
中的某些东西不喜欢你导航回同一页面的事实。
底线,我不建议使用这种方法,当您这样做时,您正在拆除并重新创建页面和底层类。
在向XML流添加项时,向任务集合添加一个元素,该任务集合是ListView控件的ItemsSource
。假设这是一个ObservableCollection,您将看到添加的反映,而不必做一些破坏性的事情,如重新加载页面(我假设只是重新读取您刚刚写的文件?)