c#和Windows中的事务性文件编写
本文关键字:文件 事务性 Windows | 更新日期: 2023-09-27 18:07:47
我有一个数据文件,我需要不时地对该文件进行更改。这种变化包括在多个地方改变信息。例如,更改文件末尾附近的一些数据,并更改文件开始附近的一些信息。我希望两个单独的写操作要么都成功,要么都失败,否则它将处于不确定状态并有效地损坏。在。net中或一般情况下是否有任何内置的支持?
如果不是,那么其他人如何解决这个问题?Windows上的数据库如何解决这个问题?
UPDATE:我不想使用事务性NTFS功能,因为它在旧版本的Windows(如XP)上不可用,并且在上面描述的文件覆盖场景中速度很慢。
DB基本上使用日志概念(至少我知道的那些)。一个想法是,写操作在日志中写入,直到Writer
没有提交事务。(当然这只是基本的描述,很简单)
在您的情况下,它可以是文件的副本,您将在其中写入数据,而如果一切都成功完成,则将原始文件替换为它的副本。
替换为:将原始文件重命名为old
,将备份文件重命名为original
。
如果替换失败:这是一个严重错误,应用程序应该通过容错策略来处理。可能是它通知用户保存操作失败,并尝试恢复。顺便说一下,任何时候你都有两份文件。一个是写操作刚开始的时候,一个是写操作结束的时候。
我们在过去的项目中使用了这种技术,比如工业控制系统,并取得了很大的成功。
如果你使用的是Windows 6或更高版本(Vista/7/2008/2008R2), NTFS文件系统支持事务(包括分布式事务):但是你需要使用p/Invoke来调用Win32 api(参见这个问题)。
如果您需要在旧版本的Windows或非ntfs分区上运行,则需要自己执行事务。这绝对是不平凡的:在处理跨进程的多个进程(包括通过共享的远程访问)和系统崩溃时获得完整的ACID功能,即使假设只有您的访问方法将被使用(其他一些使用正常Win32 api的进程当然会破坏事情)。
在这种情况下,数据库几乎肯定会更容易:有许多进程内数据库(SQL精简版,SQL Lite,…),所以数据库不需要服务器进程。