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 NAME和SE\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。