当我们打开删除挂起的文件时,即使它们具有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,并且非常好奇为什么他们这样设计。
有充分的理由吗?
答案 0 :(得分:3)
不得不研究这个琐事,就像往常一样,当winapi中的某些东西只能通过历史原因来解释时,Raymond Chen会在那里告诉我们:
http://blogs.msdn.com/b/oldnewthing/archive/2007/11/09/6001644.aspx
所以STATUS_DELETE_PENDING实际上意味着与你期望它的意思不同的东西!
答案 1 :(得分:3)
Windows内核和“本机”api使用NTSTATUS代码。 Win32使用Win32错误代码,可以追溯到DOS错误代码。 Windows始终将STATUS_DELETE_PENDING映射到ERROR_ACCESS_DENIED。我能够在NT4上验证这一点,它没有在winerror.h中定义ERROR_DELETE_PENDING。
在Windows XP中,ERROR_DELETE_PENDING的定义已添加到winerror.h中,但看起来映射一直是这样的。
我猜有人和你有同样的想法 - 为什么不将STATUS_DELETE_PENDING映射到ERROR_DELETE_PENDING,试图添加这个新的错误代码,发现它破坏了期望ERROR_ACCESS_DENIED的应用程序。所以他改回了映射但忘了从winerror.h中删除定义