在Windows上可以重命名原子文件(带有覆盖)吗?
时间:2020-03-06 15:04:52 来源:igfitidea点击:
在POSIX系统上,rename(2)提供了原子重命名操作,包括覆盖目标文件(如果存在)以及是否允许权限。
有什么办法可以在Windows上获得相同的语义吗?我知道Vista和Server 2008上的MoveFileTransacted(),但是我需要它来支持Win2k及更高版本。
这里的关键词是原子的……解决方案一定不能以使操作处于不一致状态的任何方式失败。
我见过很多人说这在Win32上是不可能的,但是我问你,真的吗?
如果可能,请提供可靠的引用。
解决方案
我们仍然可以在Windows上进行rename()调用,尽管我想如果不知道文件系统(例如,如果我们使用FAT),就无法做出想要的保证。
但是,我们可以使用MoveFileEx并使用MOVEFILE_REPLACE_EXISTING
和MOVEFILE_WRITE_THROUGH选项。后者在MSDN中具有以下描述:
Setting this value guarantees that a move performed as a copy and delete operation is flushed to disk before the function returns. The flush occurs at the end of the copy operation.
我知道这不一定与重命名操作相同,但我认为这可能是对文件移动最好的保证,它应该用于更简单的重命名。
Win32不保证原子文件元数据操作。我会提供引用,但是没有一个事实是没有书面或者书面保证就足够了。
我们将必须编写自己的例程来支持此操作。不幸的是,但是我们不能指望win32提供根本不是为它设计的这种级别的服务。
在Windows Vista和Windows Server 2008中,已添加了原子移动功能MoveFileTransacted()
不幸的是,这对于旧版本的Windows没有帮助。
有关MSDN的有趣文章。
请参阅Win32中的ReplaceFile()
(http://research.microsoft.com/pubs/64525/tr-2006-45.pdf)