为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2019-10-29 11:21:27
在POSIX系统上,rename(2)提供了原子重命名操作,包括覆盖目标文件(如果存在)以及是否允许权限。有没有办法在Windows上获得相同的语义?我知道Vista和Server 2008上的MoveFileTransacted(),但是我需要它来支持Win2k及更高版本。这里的关键词是原子的 ……解决方案一定不能以使操作处于不一致状态的任何方式失败。我见过很多人说这在win32上是不可能的,但是我问你,真的吗?如果可能,请提供可靠的引用。
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

Win32不保证原子文件元数据操作。我会提供引用,但没有引用-没有书面或书面保证的事实就足够了。

您将必须编写自己的例程来支持此操作。不幸的是,但是您不能指望win32提供这种级别的服务-根本不是为它设计的。


查看完整回答
反对 回复 2019-10-29
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

在Windows Vista和Windows Server 2008中,已添加了原子移动功能-MoveFileTransacted()


不幸的是,这对于旧版本的Windows没有帮助。


查看完整回答
反对 回复 2019-10-29
?
12345678_0001

TA贡献1802条经验 获得超5个赞

在Windows上,您仍然可以进行rename()调用,尽管我想如果不知道您使用的文件系统就无法做出您想要的保证-例如,如果您使用的是FAT,则无法保证。


但是,可以使用MoveFileEx并使用MOVEFILE_REPLACE_EXISTING和MOVEFILE_WRITE_THROUGH选项。后者在MSDN中具有以下描述:


设置此值可确保在函数返回之前将作为复制和删除操作执行的移动刷新到磁盘。刷新发生在复制操作结束时。


我知道这不一定与重命名操作相同,但是我认为这可能是您获得的最佳保证-如果这样做是为了移动文件,则应该进行更简单的重命名。


查看完整回答
反对 回复 2019-10-29
  • 3 回答
  • 0 关注
  • 836 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信