我需要检索目录的句柄才能在其上调用 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
。毋庸置疑,我已经尝试了不同参数的大量,没有一个在它们上面工作。我运行我的程序作为胜利者,为了确保我真的拥有该unittests目录中的权限,我打开了一个命令shell并输入:
C:\Users\victor>echo bla >> "C:\Users\victor\Documents\Projets\libxnotify\unittests\test"
并且有效。
答案 0 :(得分:3)
ReadDirectoryChangesW的文档中有一条注明:
要获取目录句柄,请使用带有 FILE_FLAG_BACKUP_SEMANTICS 标记的
CreateFile
函数。
CreateFile的文档还有一个更详细的说明:
<强>目录强>
应用程序无法使用
CreateFile
创建目录,因此只有 OPEN_EXISTING 值对此用例的dwCreationDisposition有效。要创建目录,应用程序必须调用CreateDirectory
或CreateDirectoryEx
。要使用
CreateFile
打开目录,请将 FILE_FLAG_BACKUP_SEMANTICS 标记指定为dwFlagsAndAttributes
的一部分。如果在没有 SE_BACKUP_NAME 和 SE_RESTORE_NAME 权限的情况下使用此标记,则仍然适用相应的安全检查。
您错过了FILE_FLAG_BACKUP_SEMANTICS
的重要dwFlagsAndAttributes
标记。