【问题标题】:Save Over The XML File I Am Reading保存我正在阅读的 XML 文件
【发布时间】:2021-09-19 13:02:26
【问题描述】:

如何读取 XML 文件并编辑和保存同一个文件?我得到的问题是'文件正在使用'显然是因为我正在阅读它。我是不阅读它还是以其他方式阅读它?

我正在做的基本想法是,读取一个 SQL DB,获取写入那里的新值, 然后在新的更改时更新 XML 文件。

XmlTextWriter 选项似乎不是写入选项,而是用于写入新的 XML 文件?

XmlTextReader reader = new XmlTextReader(@"C:\Users\Pavle\Desktop\Settings.xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
doc.SelectSingleNode("/config/Settings/SleepNumber").InnerText = "new2 text";
doc.Save(@"C:\Users\Pavle\Desktop\Settings.xml");

【问题讨论】:

  • 虽然有办法解决这个问题,但我建议实际上首先写入中间/临时文件,然后验证所做的更改是否正确,然后删​​除原始文件并移动/重命名新文件。如果验证失败,那么您始终拥有原件。 (这是处理文件操作多年的经验:1. 备份 2. 不要乱用原始文件 3. 读取、修改、写入临时文件、验证、交换)

标签: c# xml visual-studio


【解决方案1】:

您的问题是您需要先关闭阅读器才能写入文件。

我有两个建议给你。

首先,尝试使用新的 LINQ-to-Xml 库。

那么你可以这样做:

string filename = @"C:\Users\Pavle\Desktop\Settings.xml";
XDocument doc2 = XDocument.Load(filename);
doc2.Root.Element("Settings").Element("SleepNumber").Value = "new2 text";
doc2.Save(filename);

其次,通常会写入一个新文件,删除旧文件,然后将新文件重命名为旧文件,以始终确保磁盘上始终有一个有效文件。在您的代码中,如果写入失败,您已经破坏了原始文件。这是个坏主意。

【讨论】:

  • 这很好用,我保存了两次。在使用“file.backup”更新之前一次,在更改之后一次,谢谢! .....我现在可能面临的问题,.NET 3.0 没有 Linq,我需要在具有 .NET 3.0 的旧服务器上运行这个程序,并且升级\安装新框架不是一个选项.. 所以也许 2 exe 的 1 表示新的,而 1 表示旧的......
  • @PavleStojanovic - 你不需要 LINQ 来完成这项工作。只需按照与本示例相同的方式使用旧的 XML 库即可。
  • 所以我的程序读取 XML 文件以获取 SQL 服务器的登录信息,然后读取 SQL 表,然后如果 SQL 信息和 XML 信息不同,则首先返回并使用 SQL 更新 XML 文件数据..
【解决方案2】:

如果您从磁盘上的文件中读取,请使用Load(string filename) method,它将文件名作为参数而不是文本阅读器。

如果这不可行,请使用 Mark Russinovich 在 Windows Internals 书中描述的方法:安全保存。它说:

  1. 保存到一个临时的新文件
  2. 关闭原文件
  3. 删除原文件
  4. 将临时文件重命名为原始文件名

如果您这样做,NTFS 文件系统驱动程序将注意到该操作并保留文件原始 MAC 时间戳的相关部分。 MAC 是修改、访问、创建的缩写。

这种方法还可以避免在电源故障或其他严重事件的情况下丢失数据:原始文件将尽可能长时间可用。

【讨论】:

    【解决方案3】:

    您可以尝试在保存之前关闭 XmlTextReader。 XmlTextReader 会锁定文件直到它被关闭。

    【讨论】:

    • 我想到了这个,但找不到关闭或退出选项..
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多