最近遇到了一个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. 1032: [JSOI2007]祖码Zuma

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 Description 这是一个流行在Jsoi的游戏,名称为祖玛.精致细腻的背景,外加神 ...

  2. eclipse 搭建Swt 环境

    我本是想用java开发一个记事本,开发记事本使用到SWT插件,我从网上找了许多的资料去集成插件,创建我的第一个SWT项目,以下是我搭建SWT环境的过程. 一.查看当前使用的exlipse 版本型号 在 ...

  3. android免root兼容所有版本ui调试工具

    SwissArmyKnife是什么 SwissArmyKnife 是一款方便调试android UI的工具,可以兼容所有android版本,不需要root权限.可以直接在android手机屏幕上显示当 ...

  4. lua 自己编译源文件

    ,下载源代码 http://www.lua.org/download.html 直接下载source ,vs2010新建win32项目 应用程序设置中设成静态库 ,将.c(除去lua.c)和.h文件加 ...

  5. CreateFile() 打开u盘 物理设备

    //以下是用的vs2010 windows7 64 管理员权限编译成功的 HANDLE hDev = CreateFile(TEXT("\\\\.\\PhysicalDrive1" ...

  6. javaWeb开发小工具--MyCommonUtils

    MyCommonUtils 参考一些资料,写了这个工具类.在这个工具类中,主要实现了2个方法: 1.生成随机的序列号 uuid(): 2.将Map中的数据封装到javaBean对象中toBean(Ma ...

  7. 【分块打表】bzoj1026 [SCOI2009]windy数

    #include<cstdio> using namespace std; #define BN 380000 const int table[]={0,79595,158824,2021 ...

  8. AngularJS是什么

    先标明来源: https://code.angularjs.org/1.3.15/docs/guide/introduction 也就是官网针对1.3.15版的说明 What Is Angular? ...

  9. 敏捷开发方法-Scrum

    为了不落后他人,于是我也开始学习Scrum,今天主要是对我最近阅读的相关资料,根据自己的理解,用自己的话来讲述Scrum中的各个环节,主要目的有两个,一个是进行知识的总结,另外一个是觉得网上很多学习资 ...

  10. zmq学习笔记

    1 zmq_socket(3) Manual Page 1.1 一个socket可连接多个对端socket: 通过使用多个zmq_connect() 1.2 一个socket可绑定到多个地址上接受连接 ...