2017-04-23 103 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

相關問題