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

use*_*890 7 .net ntfs file atomic delete-file

目标操作系统:Win2003

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

Meh*_*ari 12

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


asv*_*kau 5

老问题,但如果我可以从一个略微不同的立场添加到@Mehdrad的答案......

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

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

因此,它可能与您使用删除的方式相关或不相关,但重要的是要记住,在Windows上,删除不会立即生效,并且在并发访问下可能会阻止进一步的请求文件.