我有多个 Windows 程序(在 Windows 2000、XP 和 7 上运行),它们处理不同格式的文本文件(csv、tsv、ini 和 xml)。在文件 IO 期间不要破坏这些文件的内容非常重要。每个文件都应该可以被多个程序同时安全地访问,并且应该能够抵抗系统崩溃。 This SO answer建议使用进程内数据库,所以我正在考虑使用 Microsoft Jet Database Engine ,能够handle delimited text files (csv、tsv)和 supports transactions .我以前用过Jet,但不知道Jet事务是否真的能容忍提交阶段的意外崩溃或关机,也不知道如何处理非定界文本文件(ini、xml)。我认为尝试手动实现完全 ACIDic 文件 IO 不是一个好主意。
在 Windows 上实现文本文件事务处理的最佳方式是什么?我必须能够在 Delphi 和 C# 中执行此操作。
提前感谢您的帮助。
编辑
让我们看一个基于@SirRufo 想法的例子。暂时忘掉并发性,让我们专注于崩溃容忍度。
我将文件的内容读入数据结构以修改某些字段。当我将修改后的数据写回文件时,系统可能会崩溃。
如果我从不将数据写回原始文件,则可以避免文件损坏。这可以通过创建一个新文件轻松实现,每次保存修改时,文件名中都有一个时间戳。但这还不够:原始文件将保持完整,但新写入的文件可能已损坏。
我可以通过在时间戳后放置一个“0”字符来解决这个问题,这意味着该文件尚未经过验证。我将通过验证步骤结束写入过程:我将读取新文件,将其内容与我要保存的内存结构进行比较,如果它们相同,则将标志更改为“1”。每次程序必须读取文件时,它都会通过比较文件名中的时间戳来选择最新版本。只能保留最新版本,可以删除旧版本。
并发可以通过在读取或写入文件之前等待指定的互斥体来处理。当程序获得对文件的访问权限时,它必须从检查文件名列表开始。如果要读取文件,它将读取最新版本。另一方面,只有没有比上次读取的版本更新的版本才能开始写入。
这是一种粗略、过于简单且效率低下的方法,但它表明了我的想法。写入文件是不安全的,但也许有像上面那样的简单技巧可以帮助避免文件损坏。
更新
用 Java 编写的开源解决方案:
- 原子文件交易:article-1 , article-2 , source code
- Java 原子文件事务 (JAFT):project home
- XADisk:tutorial , source code
- 原子文件:description , source code
最佳答案
使用 NTFS 文件流怎么样?将多个命名(编号/时间戳)流写入同一文件名。每个版本都可以存储在不同的流中,但实际上存储在同一个"file"或一堆文件中,保留数据并提供回滚机制...... 当你达到一定程度时,删除一些以前的流。
在 NT 4 中引入?它涵盖了所有版本。应该是防崩溃的,您将始终拥有以前的版本/流以及要恢复/回滚到的原始版本。
只是一个深夜的想法。
http://msdn.microsoft.com/en-gb/library/windows/desktop/aa364404%28v=vs.85%29.aspx
关于c# - Windows 上文本文件的事务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734750/