Loading

关于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

posted @ 2022-12-20 14:50  Dwaynerbing  阅读(855)  评论(0编辑  收藏  举报