Windows上的文本文件的事务处理

kol*_*kol 9 c# windows delphi file-io transactions

我有多个Windows程序(在Windows 2000,XP和7上运行),它们处理不同格式的文本文件(csv,tsv,ini和xml).在文件IO期间不要破坏这些文件的内容是非常重要的.多个程序应该可以安全地访问每个文件,并且应该能够抵御系统崩溃.这个SO答案建议使用进程内数据库,所以我正在考虑使用Microsoft Jet数据库引擎,它能够处理分隔的文本文件(csv,tsv),并支持事务.我之前使用过Jet,但我不知道Jet事务是否真的容忍在提交阶段意外崩溃或关闭,我不知道如何处理非分隔文本文件(ini,xml).我不认为尝试手动实现完整的ACIDic文件IO是个好主意.

在Windows上实现文本文件的事务处理的最佳方法是什么?我必须能够在Delphi和C#中执行此操作.

提前谢谢你的帮助.

编辑

让我们看一个基于@ SirRufo的想法的例子.暂时忘掉并发性,让我们专注于容错.

  1. 我将文件的内容读入数据结构以修改某些字段.当我正在将修改后的数据写回文件时,系统可能会崩溃.

  2. 如果我从不将数据写回原始文件,则可以避免文件损坏.这可以通过创建一个新文件轻松实现,每次保存修改时文件名都带有时间戳.但这还不够:原始文件将保持不变,但新写的文件可能已损坏.

  3. 我可以通过在时间戳后面加一个"0"字符来解决这个问题,这意味着该文件尚未经过验证.我将通过验证步骤结束写入过程:我将读取新文件,将其内容与我正在尝试保存的内存中结构进行比较,如果它们相同,则将标志更改为"1".每次程序必须读取文件时,它会通过比较文件名中的时间戳来选择最新版本.只能保留最新版本,可以删除旧版本.

  4. 可以通过在读取或写入文件之前等待命名的互斥锁来处理并发.当程序获得对文件的访问权限时,它必须从检查文件名列表开始.如果要读取文件,它将读取最新版本.另一方面,只有在没有比上次读取的版本更新的版本时才能开始写入.

这是一种粗略,过于简单和低效的方法,但它显示了我正在考虑的内容.编写文件是不安全的,但也许有一些像上面那样的简单技巧可以帮助避免文件损坏.

UPDATE

用Java编写的开源解决方案:

Des*_*her 5

如何使用NTFS文件流?将多个命名(编号/时间戳)流写入同一文件名.每个版本都可以存储在不同的流中,但实际上存储在同一个"文件"或一堆文件中,保留数据并提供回滚机制......当你达到确定点时删除一些以前的流.

在NT 4推出?它涵盖了所有版本.应该是防撞证明,你将始终拥有以前的版本/流加上原始版本来恢复/回滚到.

只是一个深夜的想法.

http://msdn.microsoft.com/en-gb/library/windows/desktop/aa364404%28v=vs.85%29.aspx

  • 我给了你50分,但我必须强调,这不是我问题的答案。我没有得到真正的答案,所以我宁愿不给任何人赏金,但系统会自动给你一半,所以我决定给你所有的分数。 (2认同)