我需要检索一个目录的句柄,以便能够对其调用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有效。要创建目录,应用程序必须调用CreateDirectoryCreateDirectoryEx
要使用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/

10-14 15:03