File.Delete()是否在.NET下是原子的

时间:2010-02-09 15:43:48

标签: .net file atomic ntfs delete-file

目标操作系统:Win2003

正如其他关于文件操作原子性的SO问题所述,Win32根本不是为事务设计的。我仍然想知道文件删除是否可以是非原子的。毕竟,它要么被删除,要么被删除。或者文件在NTFS文件系统上是否仍然处于系统崩溃或删除过程中的其他任何其他中间状态?

2 个答案:

答案 0 :(得分:12)

NTFS是journaled file system。日志基本上等同于数据库中的事务日志。它将确保文件系统结构的一致性和完整性,就像数据库为其表所做的那样。虽然File.Delete在高级别上没有任何事务代码,但NTFS确实在文件系统级别维护事务完整性。对于其他文件系统驱动程序可能不是这样。

答案 1 :(得分:5)

老问题,但是如果我可以从略微不同的角度添加@Mehdrad的答案......

在Windows上,删除文件通常甚至不是完全同步的,甚至不是单个操作。从这个意义上说,它绝对不是原子的。

如果您查看process monitor之类的工具或查看用于编写文件系统驱动程序的MSFT文档,您会注意到在Windows上删除文件是一个多步骤的过程。首先,您需要一个文件句柄。然后将其处置设置为“已删除”。这会将文件置于具有“删除暂挂”的状态。在关闭它的最后一个句柄之前,该文件甚至不会从视图中删除。当文件处于此状态时,打开文件的新尝试将失败并显示STATUS_DELETE_PENDING。这种状态更像是一个运行时的东西 - 如果您拔出插头或重新启动,文件将不会保持该状态。

因此,它可能与您使用删除的方式有关,也可能不相关,但请务必记住,在Windows上,删除不一定会立即生效,并且在并发访问下可能会锁定更多请求到达文件。