ReadDirectoryChangesW() 报错的解决方法

在做文件夹新增判断时用到了这个函数

error C2065: 'ReadDirectoryChangesW' : undeclared identifier


需要在stdafx.h文件中

在所有的 #include <xxx.h> 前面加入
#define _WIN32_WINNT 0x400


因为在winbase.h头文件中判断是否定义了WIN32_WINNT>=0x400

原理:
1.ReadDirectoryChangesW函数定义在winbase.h头文件中,,通常windows下编程一般都包含windows.h文件,而windows.h中包含了winbase.h,所以不用再包含winbase.h
2.在winbase.h中ReadDirectoryChangesW原型定义如下:
#if(_WIN32_WINNT >= 0x0400)
WINBASEAPI
BOOL
WINAPI
ReadDirectoryChangesW(
    HANDLE hDirectory,
    LPVOID lpBuffer,
    DWORD nBufferLength,
    BOOL bWatchSubtree,
    DWORD dwNotifyFilter,
    LPDWORD lpBytesReturned,
    LPOVERLAPPED lpOverlapped,
    LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );
#endif
可以看出,这是一个条件编译语句,只有定义了_WIN32_WINNT 这段代码才会被编译器加入,因此需要定义
_WIN32_WINNT ,其值应大于等于0x0400(好像0x0400表示Windows2000,0x0500表示Windows XP),且需要
定义在包含windows.h(或winbase.h)的定义语句之前。


在c文件中

if(hDir ==INVALID_HANDLE_VALUE  ) 
return false;

char buf[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION*)buf;
DWORD dwBytesReturned;        
while(true)
{
//CHAR*   FilePath=strDir.GetBuffer(0);
if(ReadDirectoryChangesW(hDir,
pNotify,
sizeof(buf),
false,//是否监控子目录
FILE_NOTIFY_CHANGE_FILE_NAME|
FILE_NOTIFY_CHANGE_DIR_NAME,
// FILE_NOTIFY_CHANGE_ATTRIBUTES|
// FILE_NOTIFY_CHANGE_SIZE|
// FILE_NOTIFY_CHANGE_LAST_WRITE|
// FILE_NOTIFY_CHANGE_LAST_ACCESS|
// FILE_NOTIFY_CHANGE_CREATION|
// FILE_NOTIFY_CHANGE_SECURITY,
&dwBytesReturned,
NULL,
NULL ) )
ReadDirectoryChangesW右键查看定义,不会跳转到winbase.h

在 INVALID_HANDLE_VALUE上右键查看定义可以跳转到winbase.h

说明该函数只要有文件或文件夹改变事件就会收到通知,所以要加入PathIsDirectory() 函数判断下是文件夹还是文件事件


在win8中断点调试时候发现会出现程序崩溃,提示不能call某段代码。全速运行又ok。。。 实验中

你可能感兴趣的:(ReadDirectoryChangesW() 报错的解决方法)