在没有FILE_SHARE_DELETE的情况下重命名文件在另一个进程中打开

时间:2017-04-23 17:28:27

标签: .net windows winapi visual-c++ filesystems

使用Windows API,是否可以重命名在没有FILE_SHARE_DELETE权限的情况下在另一个进程中打开的文件?

我认为基于CreateFile docs说:

是不可能的
  

注意:删除访问权限允许删除和重命名操作。

与此一致,在最终用户命令提示符下通过常规rename重命名,我经常遇到The process cannot access the file because it is being used by another process.;通过最终用户GUI和python的os.rename进行重命名时会发生类似的错误。

但是,this高度支持的答案似乎恰恰相反:

  

如果任何其他进程在没有删除共享的情况下打开文件,则删除将失败,重命名绝不是问题。

这不仅仅是一个小问题;整个答案取决于该陈述:如果重命名在删除时不会失败,它只解决OP问题。

我错过了什么?

注意:如果重要,我指的是Windows 10,使用C ++ API(我认为它比C#API更强大)。

修改:将代码段移至new question

1 个答案:

答案 0 :(得分:1)

只能使用MOVEFILE_DELAY_UNTIL_REBOOT标志作为延迟操作。这是一种特权操作,需要用户上下文启用管理员令牌(UAC)。这是安装程序在使用时替换文件的方式,然后他们要求操作员重新启动系统。

正如您所看到的,这并非易事,您应该尽量避免这样做。