我对C#比较陌生,所以请容忍我。
我正在编写一个需要可靠的业务应用程序(用C#、.NET 4)。数据将存储在文件中。文件将定期修改(重写),因此我担心可能会出错(断电,应用程序被终止,系统冻结,等等)同时保存数据,这将(我认为)导致损坏的文件。我知道没有保存的数据会丢失,但我不能丢失已经保存的数据(因为损坏或...)。
我的想法是每个文件有2个版本,每次重写最旧的文件。然后,在我的应用程序意外结束的情况下,至少应该有一个文件仍然有效。
这是一种好的方法吗?还有什么我能做的吗?(数据库不是一个选项)
感谢您的时间和答案。
发布于 2011-11-01 01:52:09
许多程序使用这种方法,但通常,他们会复制更多,以避免人为错误。
例如,Cadsoft Eagle (一个用来设计电路和印刷电路板的程序)对同一个文件做了多达9份备份,称之为file.b#1 ...file.b#9
您可以做的另一件事是对散列进行散列:在文件末尾附加一个类似CRC32或MD5的散列。当你打开它时,你会检查CRC或MD5,如果它们不匹配,文件就被损坏了。这也将迫使您防止有人无意或故意尝试使用另一个程序修改您的文件。这也可以让你知道硬盘或U盘是否损坏。
当然,保存文件操作越快,丢失数据的风险就越小,但您不能确保在写入过程中或写入之后不会发生任何事情。
考虑到硬盘驱动器、usb驱动器和windows操作系统都使用缓存,这也意味着,如果您完成了数据写入,可能是操作系统或磁盘本身仍然没有物理上将其写入磁盘。
你可以做的另一件事,保存到一个临时文件,如果一切正常,你将文件移动到真正的目标文件夹,这将减少有半个文件的风险。
您可以将所有这些技术混合在一起。
发布于 2011-11-01 01:56:17
您可以使用“安全文件写入”技术,而不是“总是写入最旧的文件”:
(假设您最终要将数据保存到foo.data,并且具有该名称的文件包含以前的有效版本。)
将新数据写入foo.data.new
foo.data
foo.data.old
foo.data.new to foo.data.old
foo.data.new to foo.data
foo.data.old在任何时候,您总是至少有一个有效的文件,并且您可以从文件名中辨别哪个是要读取的文件。当然,这是假设您的文件系统以原子方式处理重命名和删除操作。
foo.data和foo.data.new存在,则加载foo.data;foo.data.new可能被破坏(例如,在写入过程中关闭电源)foo.data.old和D26都存在,这两个版本应该都是有效的,但是很快就会死掉-您可能无论如何都要加载D27版本H228H129如果D30和D31存在,则D32应该是正常的,但再次出现问题,或者文件可能无法删除。F234
或者,简单地总是写入一个新文件,包括某种单调递增的计数器-这样你就不会因为错误的写入而丢失任何数据。最好的方法取决于你写的是什么。
您也可以使用File.Replace来完成这项任务,它基本上会为您执行最后三个步骤。(如果不想保留备份,则传入null作为备份名称。)
发布于 2011-11-01 01:56:36
原则上,有两种流行的方法:
或
第一种方法给你留下了(方式)更多的开发工作,但也有一个优点,如果你保存对大文件的小更改(Word用来做这个AFAIK),那么保存的速度会更快。
https://stackoverflow.com/questions/7957544
复制相似问题