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。。。 实验中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值