使用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。
但是为什么具有3个参数的'File.Replace'成功,即使目标文件正在使用?如果将目标名称重命名为备份名称会延迟到重新启动,那么将源名称重命名为目标将会失败,不是吗? – max
'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'时可以成功。 –
哇我的问题的整个答案是嵌入[删除答案](http://stackoverflow.com/a/32862684/336527)一个非常不同的问题......所以IIUC'ReplaceFile'只是改变文件元数据( =目录项)不受权限保护。非常整洁,我很惊讶这不是一个众所周知的事情,因为它是在Windows上实现原子文件写入的唯一方法。也许你可以将这些信息添加到你的答案中(假设它是正确的)? – max