一、问题描述
程序所使用的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
标签:XML,文件,stream,buffer,写入,报错,var From: https://www.cnblogs.com/dongweian/p/16994187.html