C# WPF XMLReader 和 XMLWriter System.IO.IOException

C# WPF XMLReader and XMLWriter System.IO.IOException

我在 WPF 中有 2 个按钮。

第一个将信息写入 XML 第二个把它恢复成一个List

写函数:

public static void Write(List<string> numbers) {

    XmlWriterSettings myWriterSettings = new XmlWriterSettings();
    myWriterSettings.CloseOutput = true;
    myWriterSettings.NewLineOnAttributes = true;
    using (XmlWriter myWriter = XmlWriter.Create(XMLPathRestore, myWriterSettings)) {

        myWriter.WriteStartDocument();
        myWriter.WriteStartElement("Something");

        //Writing numbers into XML

        myWriter.WriteEndElement();
        myWriter.WriteEndDocument();
        myWriter.Close();
    }
}

读取函数:

public static List<string> Read() {

    List<string> numbers = new List<string>();

    XmlReaderSettings myReaderSettings = new XmlReaderSettings();
    myReaderSettings.CloseInput = true;

    if (File.Exists(XMLPath) == true) {
        XmlReader myReader = XmlReader.Create(XMLPath, myReaderSettings);
        while (myReader.Read()) {
            //Fill List<string> numbers from XML
        }
    }
    return concernNumbers;
}

当我现在交替读写几次后,我会得到一个 System.IO.IOException,它告诉我该进程无法访问 XML 文件,因为它被另一个进程使用。

我想我可以通过在 writer 和 reader 上将 CloseInput 设置为 true 来处理这个问题,但它不起作用。

有人知道吗?

阅读完后关闭您的reader:

myReader.Close();

您已经在编写器上有一个 using 块,当块离开时应该自动关闭 XmlWriter。在读取代码中添加一个 using 块应该可以工作

using (XmlReader myReader = XmlReader.Create(XMLPath, myReaderSettings))
{
  while (myReader.Read()) {
    //Fill List<string> numbers from XML
  }
}

通常,使用 类 实现 IDisposableusing 是一种很好的做法,以确保调用 Dispose 并清理所有资源。

请参阅the documentation on using

using (var reader = XmlReader.Create(XMLPath, myReaderSettings)
{
    while (myReader.Read()) {

    }
}

using 块将在完成后处理每个 reader 实例,我建议您使用 using block