在POSIX系统上,rename(2)提供了原子重命名操作,包括覆盖目标文件(如果存在)以及是否允许权限。有没有办法在Windows上获得相同的语义?我知道Vista和Server 2008上的MoveFileTransacted(),但是我需要它来支持Win2k及更高版本。这里的关键词是原子的 ……解决方案一定不能以使操作处于不一致状态的任何方式失败。我见过很多人说这在win32上是不可能的,但是我问你,真的吗?如果可能,请提供可靠的引用。
3 回答
四季花海
TA贡献1811条经验 获得超5个赞
Win32不保证原子文件元数据操作。我会提供引用,但没有引用-没有书面或书面保证的事实就足够了。
您将必须编写自己的例程来支持此操作。不幸的是,但是您不能指望win32提供这种级别的服务-根本不是为它设计的。
Helenr
TA贡献1780条经验 获得超3个赞
在Windows Vista和Windows Server 2008中,已添加了原子移动功能-MoveFileTransacted()
不幸的是,这对于旧版本的Windows没有帮助。
繁花如伊
TA贡献2012条经验 获得超12个赞
在Windows上,您仍然可以进行rename()调用,尽管我想如果不知道您使用的文件系统就无法做出您想要的保证-例如,如果您使用的是FAT,则无法保证。
但是,可以使用MoveFileEx并使用MOVEFILE_REPLACE_EXISTING和MOVEFILE_WRITE_THROUGH选项。后者在MSDN中具有以下描述:
设置此值可确保在函数返回之前将作为复制和删除操作执行的移动刷新到磁盘。刷新发生在复制操作结束时。
我知道这不一定与重命名操作相同,但是我认为这可能是您获得的最佳保证-如果这样做是为了移动文件,则应该进行更简单的重命名。
- 3 回答
- 0 关注
- 811 浏览
添加回答
举报
0/150
提交
取消