最近遇到了一个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. Runloop 深入理解(转)

    RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...

  2. 猜数字 事先给定一个数字,然后让用户猜3次,猜不中就输了,猜中就赢了。 每次猜错,给出提示,less or big

    c = 0a = 10while c <3:    b = int(raw_input("请输入数字"))    if b == a:        print " ...

  3. js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总

    在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...

  4. Nessus导入Cookie进行Web应用安全扫描

    在不导入Cookie使用Nessus进行扫描的时候,扫描的结果是比较简单的,很多深层的问题无法被扫描出来. 需要我们手动导入Cookie,带着Cookie的状态扫描的结果会更详细更深入,以下是操作步骤 ...

  5. 小清新cygwin,正在诞生中

    正文保留. 评论记录点滴.最后汇总.

  6. MySQL入门手册

    本文内容摘自MySQL5.6官方文档,主要选取了在实践过程中所用到的部分文字解释,力求只摘录重点,快速学会使用MySQL,本文所贴代码地方就是我亲自练习过的代码,凡本文没有练习过的代码都没有贴在此处, ...

  7. 【Visual Lisp】两种出错处理方式

    两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;============================================================= ...

  8. 【收藏】Firebird知识

    本代码在:WinXp Pack 3 + Delphi2009 updata1 火鸟Firebird2.5.0.23247下测试通过.使用了Data Access面板的组件用SQL进行操作作者:LAH ...

  9. 使用ShareSDK一键分享

    首先需要到ShareSDK官方网站注册并且下载SDK,创建应用,获得ShareSDK的Appkey:文件如图: 在ShareSDK中打开即可:输入项目名称和包名,选择要分享的平台,点击确定会自动生成一 ...

  10. 由XML解析学习工厂模式

    代码段1: startupData = new StartupData(); /* 设定自定义的MyHandler给XMLReader */ StartupXMLHandler startupData ...