关于XML文件运行一段时间后,发现程序加载XML文件的时候报错问题解决方法

关于XML文件运行一段时间后,发现程序加载XML文件的时候报错问题解决方法

一、问题描述

程序所使用的XML文件运行一段时间后,发现程序加载XML文件的时候报错,要么XML内容被清空,要么就是内容少了一些,节点不完整,不是有效的XML文件。

二、问题分析

针对此现场,查阅资料后发现一般是由于电脑突然断电所致。具体原因和操作系统写入文件时为了减少对硬盘的写入次数,而使用的延迟写入有关。当我们将数据使用流写入时,其实未真正同步写入到硬件, 操作系统会在合适的时间同步到硬件,这个时间是不确定的,是根据脏页面的占比来决定的,就是说你写完文档后,有可能正好赶上同步,那断电没问题,如果没赶上,然后断电后,那文件有可能就丢失了。

​ 因此,正常来讲,对于经常会断电的应用,可以使用调用立即写入硬盘方式来减少发生数据损坏的几率,同时建议,在这种XML做配置文件的应用中,加入一个XML备份,上电时如果读XML正常,那就复制一份,如果上电时读不正常,那就将备份复制进行使用, 这样最多也就是恢复到上一次的配置。不至于恢复初始状态或者干脆提示文件错误。

三、解决方法

C#中可以使用一下方式实现立即写入硬盘。

1、使用Flush方法(清除此流的缓冲区,使得所有缓冲数据都写入到文件中)

private void ToggleButton_Click(object sender, RoutedEventArgs e)

{

var buffer = Encoding.Default.GetBytes("清除此流的缓冲区,使得所有缓冲数据都写入到文件中");

using (var stream = new FileStream("C:\\1.txt", FileMode.Create, FileAccess.Write, FileShare.None, 1024))

{

stream.Write(buffer, 0, buffer.Length);

stream.Flush();

}

}

2、使用FileOptions.WriteThrough方式(指示系统应通过任何中间缓存、直接写入磁盘)

var buffer = Encoding.Default.GetBytes("指示系统应通过任何中间缓存、直接写入磁盘");

using (var stream = new FileStream("C:\\2.txt", FileMode.Create, FileAccess.Write, FileShare.None, 1024, FileOptions.WriteThrough))

{

stream.Write(buffer, 0, buffer.Length);

}

参考文献:https://blog.csdn.net/SjzEboy/article/details/114962112

相关数据

为啥神武手游电脑版怎么掉线(神武上诉)
be七365官网

为啥神武手游电脑版怎么掉线(神武上诉)

⌚ 06-28 👁️‍🗨️ 2174
揭秘:污直播软件APP的真相与风险
体育外围app网站365

揭秘:污直播软件APP的真相与风险

⌚ 08-24 👁️‍🗨️ 2282
正规医院植发多少钱一根
体育外围app网站365

正规医院植发多少钱一根

⌚ 07-12 👁️‍🗨️ 2973