c# - Windows 上文本文件的事务处理

标签 c# windows delphi file-io transactions

我有多个 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 想法的例子。暂时忘掉并发性,让我们专注于崩溃容忍度。

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

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

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

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

这是一种粗略、过于简单且效率低下的方法,但它表明了我的想法。写入文件是不安全的,但也许有像上面那样的简单技巧可以帮助避免文件损坏。

更新

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

最佳答案

使用 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/

相关文章:

c# - double.Parse 显然不适用于某些国家/地区

java - 移动到 open-jdk 8u212 时 IntelliJ 的部署问题

.net - 电子邮件附件的自动处理

javascript - 从网页打开应用程序

c# - 无法使用 C# 和摘要式身份验证连接到 TLS Web 服务,Firefox 在 IE8 失败的地方成功

c# - Linq-to-Entities 查询中的格式化日期导致异常

c# - 如何动态添加 HTML 元素 (ASP.NET)

delphi - 在 delphi seattle 或代码分析中找不到内联变量集成

Delphi:DBGrid选项未保存?

delphi - 导入 MSHTML_TLB 会生成 12 Mb 的源文件!