最近遇到了一个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. R in a nutshell(连载)

    data(cars)dim(cars)names(cars)summary(cars)plot(cars, xlab = "Speed (mph)", ylab = "S ...

  2. php socket解决方案

    最近一直在为移动应用提供 php服务端api,以前 实时交互数据需求不严格(定时从手机端发送http请求),现在业务需求变更, 需要实时交互式接口,必须增加socket. 服务端框架使用YII 1.1 ...

  3. CAD二次开发

    用C#有一段时间了,由于单位需要,开始接触CAD二次开发,网上一搜,加入CAD开发的群,零零碎碎看了一些文章和博客,没有系统地的知识,能解决一些小问题.最近开始系统学习,再次推荐两本书,一本事纸质版的 ...

  4. max min 与 min max 的差别

    在求解最优化问题时,遇到一个对偶问题的转换:对于形如 的问题,可以转换为求解 即原问题的对偶问题.而在一般情况下: 对于这个为题的说明我参照http://math.stackexchange.com/ ...

  5. Robot Framework安装教程

    第一步:安装Python,安装的版本是python-2.7.9.amd64.msi 安装教程详见地址:http://jingyan.baidu.com/article/c910274be14d64cd ...

  6. 【转】gtk+多线程的程序实例

    #include <gtk/gtk.h> gint test() { while(1) { gdk_threads_enter(); g_printf("hello\n" ...

  7. 自定义actionbar标题

    这是我自己封装的一个activity,主要作为所有Activity的基类,可以一键关掉所有的activity, 并共享一个自定义actionbar.直接切入主题吧. 第一步就是创建自定义标题的布局文件 ...

  8. myBatis+SpringMVC+Maven整合

    一.先创建表结构 二.使用generator通过表结构自动生成model和dao.mapper 使用步骤: 1.解压generator.rar文件 2.文件中的generator.xml文件需要进行修 ...

  9. JS实现回到顶部效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Inno setup中定制安装路径

    我的程序修改了安装界面,所以我的界面中提供了更改安装路径的方法. 用户修改后的路径会被传回inno setup脚本,脚本中需要做的事情如下: 1,写一个函数,来返回新的安装路径,如: function ...