在.NET中的事务性打开/写入/replace?

我想也许我应该限制到8K。 我想打开一个文件,每次都从头到尾写。 但是,如果由于某种原因(如停电),它不完成我不想腐败的数据。 有没有办法我可以做一个事务性的文件打开/写/closures所以它不会取代以前的文件,除非它的成功?

当我谷歌我得到了很多结果数据库事务和ado而不是文件

Windows CE 5.0 HTTPD < – > .NET应用程序

如何声明全局风格,并在uwp中使用该风格

.NET的Winforms:运行时可以从我的下一个窗体的处理?

WPF richtextBox的冲突语言设置

混合托pipe/非托pipeassembly加载顺序

写入一个临时文件

删除文件

只有在写入成功的情况下才能重命名该记录文件

为防止数据丢失,如果在步骤二之后但在步骤三之前断电,则需要多一步:

在程序启动时,检查主文件删除但尚未重命名的临时文件。 如果找到,请对这些文件再次执行第三步。

Windows Vista及更高版本中的NTFS是事务性的。

我不相信你可以从纯粹的托管代码访问它 – 你需要P / Invoke到Win32 API。

开始的一个好地方是CreateTransaction , CommitTransaction , RollbackTransaction , CreateFileTransacted (和其他*Transacted )的Win32 API函数

Mark Byer的解决方案略有不同,我一直在使用:

将新内容作为要替换的文件写入“同一目录”中的临时文件

如果写入成功,则将其重命名为所需的文件

重命名是原子的,所以如果成功,那么系统不会处于未定义的状态。 如果失败,那么系统仍然处于原始状态,并且在系统重新启动时备份要替换的内容(在临时文件中)。

我的典型命名惯例是:

/path/to/original/content.data

/path/to/original/.#content.data

如果系统在某个过程中关闭了,那么在重新启动应用程序时,您可以扫描。#content.data文件,并将其作为系统出现故障时输入的内容或使用某种自定义魔法来决定无论是否“完整”决定是否重命名content.data。

我不知道你写的是什么样的数据,所以我不能帮你决定这个“魔术”是什么,但是如果它是一个xml文件,例如,你可以解析它的正确性,如果你不得到一个意外的文件结束,那么你可能有一个完整的文件

FWIW,限制自己8k写入不会节省你,因为你现在依赖于底层操作系统和FS中的实现细节,可能在下一个版本中改变,或在以前的版本中有所不同。

链接

http://83.139.107.116:8080/1.1/handlers/monodoc.ashx?link=M%3aMono.Unix.Native.Stdlib.rename(System.String%2cSystem.String )

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....