繁体   English   中英

在C#和Windows中编写事务性文件?

[英]Transactional file writing in C# and Windows?

我有一个数据文件,有时我需要写一个文件的更改。 变更包括在多个地方更改信息。 例如,更改文件末尾附近的某些数据,并更改启动附近的某些信息。 我希望两个单独的写入要么成功要么都失败,否则它将处于不确定状态并且实际上已损坏。 在.NET或一般情况下,是否有针对此场景的内置支持?

如果不是那么如何解决这个问题? Windows上的数据库如何解决此问题?

更新 :我不想使用事务性NTFS功能,因为它在旧版本的Windows(如XP)上不可用,并且在文件覆盖方案中速度很慢,如上所述。

如果您使用的是Windows 6或更高版本(Vista / 7/2008 / 2008R2),则NTFS文件系统支持事务(包括在分布式事务中):但您需要使用P / Invoke来调用Win32 API(请参阅此问题 )。

如果需要在旧版本的Windows或非NTFS分区上运行,则需要自己执行事务。 这绝对是不平凡的:在处理多个进程(包括通过共享进行远程访问)的过程中获得完整的ACID功能,即使假设只使用您的访问方法(使用普通Win32 API的其他进程)打破事情)。

在这种情况下,数据库几乎肯定会更容易:有许多进程内数据库(SQL Compact Edition,SQL Lite,...),因此数据库不需要服务器进程。

DB基本上使用了Journal概念(至少是我所知道的那个)。 一个想法是,写入操作是在日志中写入的,直到Writer不提交事务。 (当然这只是基本的描述,它很容易)

在您的情况下,它可能是您的文件的副本,您将在其中写入数据, 如果一切都成功完成请将原始文件替换为副本。

替换是:将原始文件重命名为old ,重命名备份文件,如original文件。

如果替换失败:这是一个严重的错误,应用程序应该通过容错策略来处理。 可能是它告知用户有关失败的保存操作,并尝试恢复。 顺便提一下,你有两份文件副本。 当写操作刚刚开始时,那一个,当写操作完成时。

我们在VS IDE的过去项目中使用的这种技术就像工业控制系统一样,取得了相当不错的成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM