2012-08-11 52 views
4

的情况下,我得到这个错误关闭一个的XDocument

该进程无法访问文件“C:\测试\ Person.xml”,因为它是 正在被另一个进程使用。 IOException异常是未处理

如何关闭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(); 
     } 
    } 
} 

enter image description here

+0

请张贴的堆栈跟踪。 – 2012-08-11 10:39:48

回答

6

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/DisposeXmlReader