CreateFileA失败,错误为访问被拒绝

CreateFileA失败,错误为访问被拒绝,c,winapi,C,Winapi,我需要检索目录的句柄,以便能够对其调用。事实上,我需要更多,但让我们先轻松一点。我已将问题缩小到: m_directoryHandle = CreateFileA( "C:\\Users\\victor\\Documents\\Projets\\libxnotify\\unittests", // __in LPCTSTR lpFileName, FILE_LIST_DIRECTORY, // __in DWORD dwDesiredAccess,

我需要检索目录的句柄,以便能够对其调用。事实上,我需要更多,但让我们先轻松一点。我已将问题缩小到:

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
);
这将返回一个
无效的\u句柄\u值
,最后一个错误代码为
错误\u访问被拒绝
。不用说,我已经尝试了很多不同的参数,但没有一个是有效的。我以victor的身份运行我的程序,为了确保我确实拥有unittests目录中的权限,我打开了一个命令shell并键入:

C:\Users\victor>echo bla>>“C:\Users\victor\Documents\Projets\libxnotify\unittests\test”

而且它起了作用。

的文档中有一条注释,说明:

要获取目录句柄,请使用
CreateFile
函数和FILE\u FLAG\u BACKUP\u SEMANTICS标志

随后的文档中也有关于这一点的更详细说明:

目录

应用程序无法使用
CreateFile
创建目录,因此只有OPEN\u EXISTING值对该用例的dwCreationDisposition有效。要创建目录,应用程序必须调用
CreateDirectory
CreateDirectoryEx

要使用
CreateFile
打开目录,请将文件标志\u备份\u语义标志指定为
dwFlagsAndAttributes
的一部分。如果使用此标志时没有SE\u BACKUP\u NAMESE\u RESTORE\u NAME权限,则仍将应用适当的安全检查


您错过了
dwFlagsAndAttributes

的这个重要的
文件\u标志\u备份\u语义
标志,您可能需要在第一个参数中指定文件名(以及路径)吗
C:\\Users…unittests\\filename.txt
@pmg-Hm,我的问题陈述错误。我真的需要对目录有一个句柄,以便能够对其调用
ReadDirectoryChangesW
(并监视文件)
0
,以便
dwShareMode
?这就是它可能失败的地方,因为您请求一种独占访问句柄…@RomanR我将尝试使用其他参数并让您知道。:“要获取现有目录的句柄,请使用FILE_FLAG_BACKUP_SEMANTICS FLAG调用函数。”您完全正确。现在,如果目录是强制性的,他们为什么不自己挂上自己的标志…@qdii:windowsapi使用起来总是很有趣的。对于
dwShareMode
,我可能也会使用
FILE\u SHARE\u READ
,而不是0。