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

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

时间:2022-12-20 15:01:42浏览次数:59  
标签:XML 文件 stream buffer 写入 报错 var

一、问题描述

程序所使用的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

相关文章

  • 小程序里面 SyntaxError: Unexpected end of JSON input报错解决方式
    小程序,经常有跳转传参的功能,一般带一个id或者name,title之类很短的字段,但是如果带很多数据的话,很多人喜欢使用json转换,传一个对象过去小程序传参但这样仅限于很少的字......
  • Qt进行CSV文件操作
    https://blog.csdn.net/weixin_39935783/article/details/111685444?ops_request_misc=&request_id=&biz_id=102&utm_term=qtcsv文件&utm_medium=distribute.pc_search_r......
  • 远程连接报错
    一、问题 远程连接报错:出现身份验证错误,要求的函数不受支持   二、解决方法1、window+R键,打开运行窗口,输入“regedit”,打开注册表2、找到注册表路径,计算机(可......
  • robocopy超快小文件复制工具
    robocopyi:\.  d:\oldd/e/mir/mt:120/xd“$recycle.bing”/xd“systemvolumeinformation”/r:10/w:10”mt120 表示以120线程复制robocopy 源 目标  robocop......
  • 【Selenium : 文件操作】
    一、前言文件操作是Web端自动化中比较常用的一个操作,一般文件操作包含:上传、下载WebDriver仅仅提供了下载文件相关的API,上传文件的API并没实现,需要我们自己去实现;而且......
  • Xml转Java实体类对象 xml转Javabena 对象 且多级嵌套 复杂嵌套
    最近在做企微开发,遇到了一个比较复杂的xml然后要去我将xml转成实体类xml如下<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[sys]]></Fro......
  • jsconfig.json 配置vscode只能跳转文件
    -根目录创建jsconfig.json{"compilerOptions":{"baseUrl":"./","paths":{"@/*":["src/*"],}},"include":["src/**/*"],......
  • sql xml 入门
    /*sqlxml入门:--byjinjazz--http://blog.csdn.net/jinjazz1、xml:能认识元素、属性和值2、xpath:寻址语言,类似windows目录的查找......
  • mongodb数据库修复 mongodb数据库丢失恢复 mongodb数据库数据恢复 mongodb数据库文件0
    mongodb数据库修复mongodb数据库丢失恢复mongodb数据库数据恢复mongodb数据库文件0kb数据恢复客户名称保密数据类型mongodb3.0数据容量20GB故障类型强制重启服务器......
  • linux 中如何查找在过去一段时间内修改过的文件
     001、查找在过去五分钟内修改过的文件find./-mmin-5 002、查找在过去10分钟内修改过的文件find./-mmin-10 003、查找在过去一天内修改过的文件......