在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)