在做文件夹新增判断时用到了这个函数
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。。。 实验中