C#程序操作XML 电脑掉电XML内容丢失

k475750566 2017-03-02 11:28:14
用C#编写的程序,正常对XML文件进行操作。如果电脑异常掉电,再重启之后XML文本被破坏。里面内容完全丢失。有没有人遇到过这种情况。有没有解决的办法
...全文
1849 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
"程序挂着没任何操作,把电源拔了,一两次必会出现丢失数据的情况",这就说明你并没有测试 save 之后的结果,一直在那里“想象”。没有真正测试自己的 save,也就会做出误导式的描述。
  • 打赏
  • 举报
回复
不要纠结“电脑掉电”,随时测试你的文件,假设进程退出而你的文件都被破坏了,这个bug很严重。先搞懂自己的程序流程设计上的bug。
casqeqeqe12eada 2021-01-08
  • 打赏
  • 举报
回复
遇到相似情况,最后解决方案:减少频繁读写xml文件 可以试试 把xml文件读到FileStream中 使用XDocument Load(Stream stream)来加载xml文件,操作xml文件 记得要Close();
那里有颗树 2021-01-08
  • 打赏
  • 举报
回复
写入完成释放掉。另外可以写的时候先生成临时文件,然后把之前的删除,临时文件重命名
k475750566 2017-03-02
  • 打赏
  • 举报
回复
正常读取,正常保存。但是如果是电脑掉电了,开起来XML内容就全部丢失了
xdashewan 2017-03-02
  • 打赏
  • 举报
回复
没保存?字数字数
k475750566 2017-03-02
  • 打赏
  • 举报
回复
引用 10 楼 hjq624779687 的回复:
复制,操作,保存,替换
引用错楼了,应该是这个答案
k475750566 2017-03-02
  • 打赏
  • 举报
回复
引用 9 楼 xuggzu 的回复:
找个文件恢复软件恢复下,有可能恢复
虽然还是没找到问题的原因,不过你这种方法确实可行。
夏天的枫 2017-03-02
  • 打赏
  • 举报
回复
复制,操作,保存,替换
xuggzu 2017-03-02
  • 打赏
  • 举报
回复
找个文件恢复软件恢复下,有可能恢复
k475750566 2017-03-02
  • 打赏
  • 举报
回复
引用 7 楼 diaodiaop 的回复:
正常应该是打开你的软件 读取文件. 这个可能根本不费时 因为xml你不可能那么大. 然后这个期间 所有的数据 都保存在了内存中.. 然后等你操作完成后执行保存操作,. 那么怎么可能有那么巧合的事? 我觉得不太可能吧, 你想下 你执行save的时候 才会清空xml或者重新生成一个 然后替换 怎么可能这个并发的时候 断电? 执行保存我虽然没有具体测试过,不过瞬间就可以完成吧. 反正我觉得这几率是微乎及微.....我觉得还是你代码别的地方有问题....
我是用xmldocument 载入文件,进行读取操作后,save 文件。然后程序挂着没任何操作,把电源拔了,一两次必会出现丢失数据的情况。当然前面的步骤在不掉电的情况,操作无数次都不会有问题。
by_封爱 版主 2017-03-02
  • 打赏
  • 举报
回复
正常应该是打开你的软件 读取文件. 这个可能根本不费时 因为xml你不可能那么大. 然后这个期间 所有的数据 都保存在了内存中.. 然后等你操作完成后执行保存操作,. 那么怎么可能有那么巧合的事? 我觉得不太可能吧, 你想下 你执行save的时候 才会清空xml或者重新生成一个 然后替换 怎么可能这个并发的时候 断电? 执行保存我虽然没有具体测试过,不过瞬间就可以完成吧. 反正我觉得这几率是微乎及微.....我觉得还是你代码别的地方有问题....
  • 打赏
  • 举报
回复
断电这种没办法,你可以考虑操作前先复制备份一份,如果打开xml异常,则从备份恢复
xian_wwq 2017-03-02
  • 打赏
  • 举报
回复
这种情况,肯定需要定期回写磁盘的机制 相当于程序启动后,把xml内容从文件中读取到Cache中, 其他的调用不直接与xml交互,而是与cache交互, 后台使用单独线程,周期性或者事件触发的形式保存文件。
wanghui0380 2017-03-02
  • 打赏
  • 举报
回复
看你写入的方式,Filestream有几个重载,其中一种就是打开时先把file清成0字节,如果是这种不光断电是如此,如果你写入异常也如此(写入异常实际就是没写入,但是打开时候已经清零了) 所以通常为了保险是先写临时文件,成功后在改原始文件的后缀为 原始文件名.xml.bak,最后修改新的临时文件为原始文件名(这样操作就算异常也顶多是写入不成功,继续使用原始文件而已)
xdashewan 2017-03-02
  • 打赏
  • 举报
回复
引用 2 楼 k475750566 的回复:
正常读取,正常保存。但是如果是电脑掉电了,开起来XML内容就全部丢失了
操作中未保存的内容丢失很正常,之前已经保存了的应该不会丢

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧