目标操作系统:Win2003
正如其他关于文件操作原子性的 SO 问题中所发布的那样,Win32 根本不是为事务设计的。我仍然想知道文件删除是否可以是非原子的。毕竟,它要么被删除,要么不被删除。或者文件是否可以在 NTFS 文件系统上因系统崩溃或删除过程中的其他原因而保持在任何其他中间状态?
目标操作系统:Win2003
正如其他关于文件操作原子性的 SO 问题中所发布的那样,Win32 根本不是为事务设计的。我仍然想知道文件删除是否可以是非原子的。毕竟,它要么被删除,要么不被删除。或者文件是否可以在 NTFS 文件系统上因系统崩溃或删除过程中的其他原因而保持在任何其他中间状态?
NTFS 是一个日志文件系统。日志基本上相当于数据库中的事务日志。它将确保文件系统结构的一致性和完整性,就像数据库对其表所做的那样。虽然File.Delete
在高层没有任何事务代码,但 NTFS 确实在文件系统级别维护事务完整性。这可能不适用于其他文件系统驱动程序。
老问题,但如果我可以从稍微不同的角度补充@Mehdrad的答案......
在 Windows 上,删除文件通常甚至不是完全同步的,甚至不是单个操作。从这个意义上说,它绝对不是原子的。
如果您查看诸如进程监视器之类的工具或查看用于编写文件系统驱动程序的 MSFT 文档,您会注意到在 Windows 上删除文件是一个多步骤过程。首先,您需要一个文件句柄。然后将其处置设置为“已删除”。这会将文件置于“待删除”状态。在关闭文件的最后一个句柄之前,该文件甚至不会从视图中删除。当文件处于此状态时,打开文件的新尝试将失败并显示STATUS_DELETE_PENDING
. 这种状态更像是运行时的事情——如果您拔掉插头或重新启动,文件将不会停留在该状态。
因此,它可能与您使用删除的方式相关,也可能不相关,但重要的是要记住,在 Windows 上,删除不一定会立即生效,并且在并发访问下可能会锁定进一步的请求而无法访问文件。