最近遇到了一个bug,详细情况如下:用linq to xml写xml文件,在加载的时候代码为xDocument.Load(filePath),保存的时候为xDocument.Save(filePath)。出现的问题是在文件的最后可能会多出几个字符,可能是xml文件最后一个标签,可能会更多。

遇到这个问题,开始想是不是自己代码有错误之类的,但由于本代码不会在多进程下运行,仔细看过代码之后没有发现文件读写流没有关闭的问题等,也没有其他明显的代码错误。有次调试过程中亲眼监视了最后保存之前的xdocument内容完成正确,执行完下一句之后文件里面的内容是错的。。。
百度google了许久终于在stackoverflow上找到了一个遇到同样问题的悲催IT男。虽然他出错可能是因为他load的时候load的是一个读文件流,在写之前也没有释放,可能是由于文件流未释放导致的问题。为此我还特意反编译了ms的dll,证实了微软的大牛们还是很靠谱的用using声明了文件流。不过虽然没有直接解决,但却提供了几种出现此问题的猜想。
  1. 文件读写流未关闭----已排除;
  2. 在文件写的时候可能没有完全覆盖原有的内容,举个例子一个文件原来有40个字符,但你在重写的时候只写了32个字符,操作系统(不靠谱的windows)可能没有完全按照你想的写完,导致前32个字符是你重写的,后面8个字符是上次的情况(此情景是我猜想,不保证真实发生);
对应上述两个可能的问题给出如下解决方案:
  1. 关闭读写流---IT码农还是不要犯这个错了。。
  2. 问题二有两个解决方案:
    • 在保存文件之前,将之前的文件删掉----不过要注意文件在delete的时候即便删除成功也可能会抛出异常,你还没保存就退出了。。。不靠谱的操作系统啊!!!这样导致的问题就是你的数据丢失了,之前的也没了,之后更新的也没了,祈祷数据不值钱吧。。。
    • 保存的时候用文件流的方式,声明文件流的filemode属性为truncate(截取模式,即文件流在写时先截断到0字节),保证filestream在写入之前为空的,这样在保存的时候就可以保证不会出现其它的内容。---在声明filestream的时候可能会报异常,但此时原文件不会被更改,只是丢失了新更新的内容。
如上所述,方案二的第二个方法,也是存在丢数之类的问题,但数据库也会存在这种问题(正在进行大数据量的写操作时,突然断电---很极端的一个例子),只是数据库的数据单元很小,完成更改时的单元小,损失就小罢了。当然数据库在大多数情况下要比我们自己写的文件存储靠谱多了,但没办法客户希望部署方便,xml的优势数据库无法比啊。。。
 
不知道有没有人遇到同样的问题,欢迎讨论。

xml存储bug的更多相关文章

  1. 电影管理器之XML存储电影信息数据

    电影管理器之XML存储电影信息数据 但凡管理器之类的软件,存储数据是必不可少的.存储数据的话,有几种选择.一是用数据库,把数据存储到数据库里:一是用文本文件,把数据存储到文本文件里:一种是利用XML文 ...

  2. txt\excel\cvs\xml存储测试数据

    一.目录结构 二.txt存储数据 1.txtData.txt如下: 请您输入手机/邮箱/用户名 请您输入密码 请您输入验证码 2.helper中读取txt数据的代码 def readTXT(self) ...

  3. 编程实战——电影管理器之XML存储电影信息数据

    但凡管理器之类的软件,存储数据是必不可少的.存储数据的话,有几种选择.一是用数据库,把数据存储到数据库里:一是用文本文件,把数据存储到文本文件里:一种是利用XML文件,把数据对象转换为XML后,存储到 ...

  4. 【从业余项目中学习1】C# 实现XML存储用户名密码(MD5加密)

    最近在写一个C#的项目,用户需求是实现Winform的多文档界面与Matlab算法程序之间的交互.做了一段时间发现,这既能利用业余时间,实战中也可学习一些技术,同时刚毕业也增加一份收入.所以后面会不断 ...

  5. web.xml配置bug之提示The content of element type "web-app" must match "(icon?,display- name?,description?,distributable?,

    错误:配置web.xml时,出现红色叉叉,提示 The content of element type "web-app" must match "(icon?,disp ...

  6. xml存储图片 二进制存储图片

    一.保存图片到XML文件 /// <summary> /// 保存图片到XML文件 /// </summary> private void UploadImageToXml() ...

  7. XML 存储文档

    package com.kpsh.myself; import java.io.File;import java.io.FileWriter; import org.dom4j.Document;im ...

  8. C#中使用XML存储数据

    创建XML文档 首先引用System.Xml命名空间 1.初始化一个实例 XmlDocument xd = new XmlDocument(); 2.创建XML头文件声明 XmlDeclaration ...

  9. 案例:使用xml存储数据

    HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

随机推荐

  1. 如何彻底删除antlr-2.7.2.jar

    1 找到Local\MyEclipse\MyEclipse 10\configuration\org.eclipse.osgi\bundles\12\1\.cp\data\1.3\lib,将antlr ...

  2. sql server 分布式查询 和 主从服务器搭建

    1. 8K 对应的SQL语句限制  select  *  from openquery (recei    连接服务器名称 执行的sql 语句放在   SELECT @@SERVERNAME  在本地 ...

  3. 我与solr(二)--导入mysql数据库

    关于solr的搭建详见上一篇的随笔. 步骤1: 在webapps中solrhome下新建一个文件夹名字叫做mynode(名字不固定,可以随便取,但是这个名字在后面的配置中会有所关联.)然后在mynod ...

  4. ubuntu 14.04 下evolution邮箱客户端设置(腾讯企业邮箱)

    安装 evolution 有PPA可用,支持 Ubuntu 14.04 及衍生系统.打开终端,输入以下命令: sudo add-apt-repository ppa:fta/gnome3 sudo a ...

  5. css样式重置,不建议用通配符

    由于各个浏览器对css样式的默认样式不一致,所以有必要进行样式重置.在网上看到很多建议使用 *{margin:0;padding:0} 重置margin和padding.建议不这样子使用,原因主要是性 ...

  6. java.lang.OutOfMemoryError: Java heap space解决方法

    引起java.lang.OutOfMemoryError: Java heap space异常,可能是由JAVA的堆栈设置太小的原因 根据网上的答案大致有以下两种解决方法: 1.在D:/apache- ...

  7. TreeMap源码分析

    MapClassDiagram

  8. C++查找指定目录下所以指定类型的文件

    /*************************************************************** 函数名称:FindFile 查找指定目录下指定文件 输入:fileNa ...

  9. 在chrome下的文本框sendkeys,提示element can't focus--解决方法

    在chrome下的文本框sendkeys,提示element can't focus--解决方法(成都-半步流雲,群友解决) 成都-半步流雲1.升级你的chromedriver,2.降chrome版本 ...

  10. win server服务安装

    从一台机子的服务移到我的测试环境中: 1.copy 100pC上的服务目录(d:\...)到13PC中