我需要检索一个目录的句柄,以便能够对其调用ReadDirectoryChangesW。实际上,我需要的不止这些,但我们先放轻松。我把问题缩小到:
m_directoryHandle = CreateFileA(
"C:\\Users\\victor\\Documents\\Projets\\libxnotify\\unittests", // __in LPCTSTR lpFileName,
FILE_LIST_DIRECTORY, // __in DWORD dwDesiredAccess,
0, // __in DWORD dwShareMode,
0, // __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
OPEN_EXISTING, // __in DWORD dwCreationDisposition,
0, // __in DWORD dwFlagsAndAttributes,
0 // __in_opt HANDLE hTemplateFile
);
这将返回一个
INVALID_HANDLE_VALUE
,最后一个错误代码为ERROR_ACCESS_DENIED
。不用说,我试过很多不同的参数,但没有一个能起作用。我以victor的身份运行我的程序,为了确保我在unittests目录中确实拥有权限,我打开了一个命令shell并键入:C:\Users\victor>echo bla >> "C:\Users\victor\Documents\Projets\libxnotify\unittests\test"
而且成功了。
最佳答案
ReadDirectoryChangesW的文档中有一条注释:
要获取目录的句柄,请使用带有FILE_FLAG_BACKUP_语义标志的CreateFile
函数。
CreateFile的文档对此也有更详细的说明:
名录
应用程序无法使用CreateFile
创建目录,因此对于此用例,只有OPEN_EXISTING值对dwCreationDisposition有效。要创建目录,应用程序必须调用CreateDirectory
或CreateDirectoryEx
。
要使用CreateFile
打开目录,请将FILE_FLAG_BACKUP_SEMANTICS标志指定为dwFlagsAndAttributes
的一部分。如果使用此标志时没有SE_BACKUP_NAME和SE_RESTORE_NAME权限,则仍会应用适当的安全检查。
你错过了这个重要的FILE_FLAG_BACKUP_SEMANTICS
标志。
关于c - CreateFile失败,出现ERROR_ACCESS_DENIED,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9559696/