在Windows上可以重命名(覆盖)原子文件吗?

在POSIX系统上,rename(2)提供了原子重命名操作,包括覆盖目标文件(如果存在)以及是否允许权限。


有没有办法在Windows上获得相同的语义?我知道Vista和Server 2008上的MoveFileTransacted(),但是我需要它来支持Win2k及更高版本。


这里的关键词是原子的 ……解决方案一定不能以使操作处于不一致状态的任何方式失败。


我见过很多人说这在win32上是不可能的,但是我问你,真的吗?


如果可能,请提供可靠的引用。


慕的地6264312
浏览 812回答 3
3回答

四季花海

Win32不保证原子文件元数据操作。我会提供引用,但没有引用-没有书面或书面保证的事实就足够了。您将必须编写自己的例程来支持此操作。不幸的是,但是您不能指望win32提供这种级别的服务-根本不是为它设计的。

Helenr

在Windows Vista和Windows Server 2008中,已添加了原子移动功能-MoveFileTransacted()不幸的是,这对于旧版本的Windows没有帮助。

繁花如伊

在Windows上,您仍然可以进行rename()调用,尽管我想如果不知道您使用的文件系统就无法做出您想要的保证-例如,如果您使用的是FAT,则无法保证。但是,可以使用MoveFileEx并使用MOVEFILE_REPLACE_EXISTING和MOVEFILE_WRITE_THROUGH选项。后者在MSDN中具有以下描述:设置此值可确保在函数返回之前将作为复制和删除操作执行的移动刷新到磁盘。刷新发生在复制操作结束时。我知道这不一定与重命名操作相同,但是我认为这可能是您获得的最佳保证-如果这样做是为了移动文件,则应该进行更简单的重命名。
打开App,查看更多内容
随时随地看视频慕课网APP