2011-07-13 160 views
3

當我們打開刪除掛起的文件時,Windows子系統返回ERROR_ACCESS_DENIED,即使它們具有ERROR_DELETE_PENDING狀態。當我嘗試打開刪除掛起文件時,爲什麼Windows返回ERROR_ACCESS_DENIED

HANDLE h = CreateFile(L"C:\\test.txt", 
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, 0, CREATE_ALWAYS, 0, 0); 
// Succeed 

BOOL fOk = DeleteFile(L"C:\\test.txt"); 
// Succeed. The file has been delete pended now, 
// because the file is still opening. 

HANDLE h2 = CreateFile(L"C:\\test.txt", 
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0); 
// Failed with ERROR_ACCESS_DENIED. But why not ERROR_DELETE_PENDING?  

對於上次的CreateFile函數,文件系統驅動程序返回了STATUS_DELETE_PENDING。
但Win32子系統將其轉換爲ERROR_ACCESS_DENIED。爲什麼?

我認爲它應該是一個ERROR_DELETE_PENDING,我很好奇他們爲什麼這樣設計。
有沒有很好的理由?

回答

3

Windows內核和「native」API使用NTSTATUS代碼。 Win32使用可以追溯到DOS錯誤代碼的Win32錯誤代碼。 Windows始終將STATUS_DELETE_PENDING映射到ERROR_ACCESS_DENIED。我能夠在NT4上驗證這個沒有在winerror.h中定義ERROR_DELETE_PENDING的。

ERROR_DELETE_PENDING的定義被添加到Windows XP中的winerror.h中,但它看起來像映射一直是這種方式。

我想有人和你有同樣的想法 - 爲什麼不把STATUS_DELETE_PENDING映射到ERROR_DELETE_PENDING,試圖添加這個新的錯誤代碼,並發現它打破了期望ERROR_ACCESS_DENIED的應用程序。所以他改變了映射,但忘了從winerror.h中刪除定義。

3

只好太研究這個瑣事,一如既往當WINAPI東西只能由歷史原因來解釋雷蒙德陳有來告訴我們:

http://blogs.msdn.com/b/oldnewthing/archive/2007/11/09/6001644.aspx

所以STATUS_DELETE_PENDING實際上意味着什麼不同於你期望的意思!

+0

CreateFile不會返回ERROR_DELETE_PENDING它返回ERROR_ACCESS_DENIED。這個事實對雷蒙德撰寫博客文章來說並不重要。 – John

+0

我只指出STATUS_DELETE_PENDING與您期望的不同。這個問題在我回答之後發生了變化,那是幾周前的事。 –

相關問題