2017-04-23 50 views
0

使用Windows API,是有可能重命名一个文件,该文件在另一个进程中打开,而不FILE_SHARE_DELETE权限?重命名另一个进程中打开文件而不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高度upvoted答案似乎状态正好相反:如果任何其他进程已经打开,而不删除共享文件

删除会失败,重命名从来都不是一个问题。

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

我错过了什么?

注:如果它的事项,我指到Windows 10,使用C++ API(我假设是严格比C#API更强大)。

编辑:移动代码片段到new question

回答

1

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

正如你所看到的,是不平凡的,你应该尽量避免这样做。

+0

但是为什么具有3个参数的'File.Replace'成功,即使目标文件正在使用?如果将目标名称重命名为备份名称会延迟到重新启动,那么将源名称重命名为目标将会失败,不是吗? – max

+0

'File.Replace'是一个不同的操作。它映射到['ReplaceFile'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512(v = vs.85).aspx)。请参阅http://stackoverflow.com/questions/32860388/replacefile-alternative-when-application-keeps-file-locked为什么当另一个应用程序打开'lpReplacedFileName'时可以成功。 –

+0

哇我的问题的整个答案是嵌入[删除答案](http://stackoverflow.com/a/32862684/336527)一个非常不同的问题......所以IIUC'ReplaceFile'只是改变文件元数据( =目录项)不受权限保护。非常整洁,我很惊讶这不是一个众所周知的事情,因为它是在Windows上实现原子文件写入的唯一方法。也许你可以将这些信息添加到你的答案中(假设它是正确的)? – max

相关问题