关闭XDOCUMENT的实例

我收到了这个错误

该进程无法访问文件“C:\ test \ Person.xml”,因为它正由另一个进程使用。 IOException是UnHandled

如何在文件中保存内容后关闭xml文件的实例?

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.Linq; namespace XmlAddDelRecord { public partial class Form1 : Form { public Form1() { InitializeComponent(); LoadDatagrid(); } private void LoadDatagrid() { try { XmlReader xmlFile; xmlFile = XmlReader.Create(filePath, new XmlReaderSettings()); DataSet ds = new DataSet(); ds.ReadXml(xmlFile); dataGridView1.DataSource = ds.Tables[0]; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private const string filePath = @"C:\test\Person.xml"; private void button1_Click(object sender, EventArgs e) { var xmlDoc = new XmlDocument(); xmlDoc.Load(filePath); var subRoot = xmlDoc.CreateElement("Customer"); subRoot.SetAttribute("id", textBox6.Text.Trim()); var firstName = xmlDoc.CreateElement("FirstName"); var xmlTextUserName = xmlDoc.CreateTextNode(textBox1.Text.Trim()); firstName.AppendChild(xmlTextUserName); subRoot.AppendChild(firstName); if (xmlDoc.DocumentElement != null) xmlDoc.DocumentElement.AppendChild(subRoot); var email = xmlDoc.CreateElement("LastName"); var xmlTextEmail = xmlDoc.CreateTextNode(textBox2.Text.Trim()); email.AppendChild(xmlTextEmail); subRoot.AppendChild(email); if (xmlDoc.DocumentElement != null) xmlDoc.DocumentElement.AppendChild(subRoot); var mobile = xmlDoc.CreateElement("Mobile"); var xmlTextMobile = xmlDoc.CreateTextNode(textBox3.Text.Trim()); mobile.AppendChild(xmlTextMobile); subRoot.AppendChild(mobile); if (xmlDoc.DocumentElement != null) xmlDoc.DocumentElement.AppendChild(subRoot); var address = xmlDoc.CreateElement("Address"); var xmlTextAddress = xmlDoc.CreateTextNode(textBox4.Text.Trim()); address.AppendChild(xmlTextAddress); subRoot.AppendChild(address); if (xmlDoc.DocumentElement != null) xmlDoc.DocumentElement.AppendChild(subRoot); var country= xmlDoc.CreateElement("Country"); var xmlTextCountry = xmlDoc.CreateTextNode(textBox5.Text.Trim()); country.AppendChild(xmlTextCountry); subRoot.AppendChild(country); if (xmlDoc.DocumentElement != null) xmlDoc.DocumentElement.AppendChild(subRoot); xmlDoc.Save(filePath); if (File.Exists(filePath)) return; var textWritter = new XmlTextWriter(filePath, null); textWritter.WriteStartDocument(); textWritter.WriteStartElement("CustomerRecord"); textWritter.WriteEndElement(); textWritter.Close(); } //Search record if not found then add a record private void button3_Click(object sender, EventArgs e) { XDocument doc = XDocument.Load(filePath); string id = textBox6.Text; XElement element = doc.Descendants("Customer").FirstOrDefault(p => p.Attribute("id").Value == id); if (element != null) { //found textBox6.Text = textBox6.Text; textBox1.Text = (string)element.Element("FirstName"); textBox2.Text = (string)element.Element("LastName"); textBox3.Text = (string)element.Element("Mobile"); textBox4.Text = (string)element.Element("Address"); textBox5.Text = (string)element.Element("Country"); } else { //Not found //To add a customer var FirstName = textBox1.Text; var LastName = textBox2.Text; var Mobile = textBox3.Text; var Address = textBox4.Text; var Country = textBox5.Text; var ele = new XElement("Customer"); ele.SetAttributeValue("id", id); ele.Add(new XElement("FirstName", FirstName)); ele.Add(new XElement("LastName", LastName)); ele.Add(new XElement("Mobile", Mobile)); ele.Add(new XElement("Address", Address)); ele.Add(new XElement("Country", Country)); if (doc.Root != null) doc.Root.Add(ele); doc.Save(filePath, SaveOptions.None); dataGridView1.Refresh(); dataGridView1.Parent.Refresh(); } } //To Remove Record private void button2_Click(object sender, EventArgs e) { XDocument doc = XDocument.Load(filePath); var q = from node in doc.Descendants("Customer") let attr = node.Attribute("id") where attr != null && attr.Value == textBox6.Text select node; q.ToList().ForEach(x => x.Remove()); doc.Save(filePath, SaveOptions.None); dataGridView1.Refresh(); dataGridView1.Parent.Refresh(); } } } 

在此处输入图像描述

XDocument.Load(string)在加载后关闭文件。 如果您需要直接访问i / o对象并可以自己关闭它:

 XDocument document; using (var reader = XmlReader.Create(file)) { document = XDocument.Load(reader); } 

似乎是其他程序访问此文件。


LoadDatagrid()方法中更改为:

 private void LoadDatagrid() { try { using (XmlReader xmlFile = XmlReader.Create(filePath, new XmlReaderSettings())) { DataSet ds = new DataSet(); ds.ReadXml(xmlFile); dataGridView1.DataSource = ds.Tables[0]; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } 

您必须Close/Dispose您的XmlReader