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不包含我的新添加的任务。

WinRT -添加新的项目到XML和访问拒绝

您可能应该更改页面,以便它不会导航到自己。

但是,暂时忽略它,您还有另一个问题。您永远不会显式关闭文件。这意味着,如果页面导航到自身的速度足够快,那么您试图打开的文件仍然是打开的。这会导致访问被拒绝错误。要解决这个问题,您需要将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,您将看到添加的反映,而不必做一些破坏性的事情,如重新加载页面(我假设只是重新读取您刚刚写的文件?)