我有多个 Windows 程序(在 Windows 2000、XP 和 7 上运行),它们处理不同格式的文本文件(csv、tsv、ini 和 xml)。在文件 IO 期间不要损坏这些文件的内容非常重要。每个文件都应该可以被多个程序同时安全地访问,并且应该能够防止系统崩溃。这个 SO 答案建议使用进程内数据库,所以我正在考虑使用Microsoft Jet Database Engine,它能够处理分隔文本文件(csv、tsv)并支持事务. 我之前用过Jet,但不知道Jet事务是否真的能容忍提交阶段的意外崩溃或关机,也不知道如何处理非分隔文本文件(ini、xml)。我认为尝试手动实现完全 ACIDic 文件 IO 不是一个好主意。
在 Windows 上实现文本文件事务处理的最佳方法是什么?我必须能够在 Delphi 和 C# 中做到这一点。
提前谢谢你的帮助。
编辑
让我们看一个基于@SirRufo 想法的示例。暂时忘记并发,让我们专注于崩溃容错。
我将文件的内容读入数据结构以修改某些字段。当我正在将修改后的数据写回文件时,系统可能会崩溃。
如果我从不将数据写回原始文件,则可以避免文件损坏。这可以通过创建一个新文件来轻松实现,每次保存修改时文件名中都有一个时间戳。但这还不够:原始文件将保持不变,但新写入的文件可能已损坏。
我可以通过在时间戳后面加上一个“0”字符来解决这个问题,这意味着该文件尚未经过验证。我将通过验证步骤结束写入过程:我将读取新文件,将其内容与我试图保存的内存结构进行比较,如果它们相同,则将标志更改为“1”。每次程序必须读取文件时,它都会通过比较文件名中的时间戳来选择最新版本。只能保留最新版本,旧版本可以删除。
并发可以通过在读取或写入文件之前等待命名互斥体来处理。当程序获得对文件的访问权时,它必须从检查文件名列表开始。如果它想读取文件,它将读取最新版本。另一方面,只有在没有比上次读取的版本更新的版本时才能开始写入。
这是一种粗略、过于简单且效率低下的方法,但它显示了我的想法。写入文件是不安全的,但也许有像上面这样的简单技巧可以帮助避免文件损坏。
更新
用 Java 编写的开源解决方案: