关闭 XDOCUMENT 的实例

2024-06-19

我收到这个错误

该进程无法访问文件“C:\test\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();
        }
    }
}

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

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

似乎有其他程序访问该文件。


in the 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 your XmlReader

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关闭 XDOCUMENT 的实例 的相关文章

  • 如何获取网络服务的状态

    如何使用 C 获取 Web 服务的状态 无论是成功完成 失败还是待处理 private void button1 Click object sender EventArgs e var url servicsURL try var myRe
  • 动态库使用静态库,出现未定义的符号

    我一直在寻找解决问题的方法 只是得到了一些线索 但我找不到任何一致的解决方案 我有一个动态库 libdyna so 的代码 它使用3个静态库 libone a libtwo a lib Three a 和log4cpp库的功能 当我第一次构
  • MVC 2视图显示错误的模型信息

    我在一个项目中使用 MVC 2 但我遇到了视图问题 在控制器中我有代码 return View calendarDay 如果我调试这一行并检查 calendarDay 它会告诉我 calendarDay Id 属性等于 2 在视图中我有一些
  • 具有自动返回类型推导的 Friend 函数模板无法访问私有成员

    抱歉这个问题的标题太复杂了 我试图描述我为这个问题构建的最小 SSCCE 我有以下代码 include
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 委托 System.Action 不接受 1 个参数

    那个行动 readonly Action execute public RelayCommand Action execute this execute null public RelayCommand Action execute Fun
  • 如何更改控制台中的光标位置?

    我想用Console ReadLine 在上一行中并使其显示如下 HeresomeText gt input Not like HeresomeText gt input 可以做吗 使用 Write 方法而不是 WriteLine 方法 C
  • 使用 rhino 模拟进行 lambda 单元测试失败

    如果我有这个测试 Expect Call session Single
  • C#:如何计算纵横比

    我对编程比较陌生 我需要根据给定尺寸 例如 axb 计算纵横比 16 9 或 4 3 我如何使用 C 来实现这一点 任何帮助将不胜感激 public string AspectRatio int x int y code am lookin
  • 更改 Json 中属性的键

    这些天我正在尝试制作一个 json 编辑器 与树视图一起使用 我确实更改了值函数 我也可以更改一些键 但我无法在对象中设置键 我可以设置值 SetValue ref JObject main JToken token JToken newV
  • 即使在不活动状态下,Hangfire 也会继续运行 SQL 查询

    我正在开发一个 ASP net MVC 5 网站 并使用 Hangfire 来安排一些任务 在本例中每 3 分钟一次 我知道一个事实是 运行这样的任务 以及与之相关的数据库查询 只需要几秒钟 我面临的问题是 Hangfire 似乎让我的 S
  • llvm clang 编译器上的dynamic_cast失败

    我看到一个奇怪的失败dynamic cast正在返回NULL在 clang 编译器上 但相同的代码可以在 gcc 环境下运行 您能否指出根本原因是什么 之间可能有什么区别dynamic cast关于 llvm 和 gcc 我正在使用两个编译
  • 在实体框架中不使用 Dispose 或 using()

    我一路上正在编写一个网络应用程序并学习实体框架 如果我做错了什么 我很好奇 我在查询时没有使用过 dispose 或 using 语句 我的存储库示例 public User GetUserById int sessionId var us
  • OpenFileDialog 中的多个文件扩展名

    如何在一组中使用多个文件扩展名OpenFileDialog 我有Filter BMP bmp GIF gif JPG jpg PNG png TIFF tiff 我想创建组 以便 JPG 为 jpg 和 jpeg TIFF 为 tif 和
  • VS 2012 语法高亮

    我有 2 台计算机运行 VS 2012 pro 但它们都没有像 VS2010 那样显示基于 XML 的文件的任何突出显示或着色 我安装的唯一快捷版工具是 SQL 2012 所以我不认为这是问题所在 其中一台计算机上从未安装过 WebMatr
  • 访问控制器类中的 appsettings.json 值

    无法弄清楚如何读取startup cs之外的appsettings json值 例如 我想做的是在 Layout cshtml 中 从配置中添加站点名称 例如 ViewData SiteName Configuration GetValue
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • 将变量传递给 SSIS 中的项目参数

    我是这个网络的新手 希望我能找到这个问题的答案 我有一个 SSIS 项目 其中包含多个使用项目参数的包 我正在尝试更新项目参数 例如 PeriodStart 2014年5月31日 我找不到动态写入项目参数的方法 我在 4 0 框架中使用 V
  • 在方法签名中使用 new 关键字通常只是为了可读性吗?

    我读过关于new关键词在方法签名中并看到了下面的例子this https stackoverflow com questions 1014295 c sharp new keyword in method signature发帖了 但还是不
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在

随机推荐