关于ReadDirectoryChangesW函数的问题,大家快来帮忙啊

浮生专栏 2012-07-10 02:10:47
该函数第二个参数中应该记录了函数返回的一些信息,但是我的程序总是得不到,不知道为什么,求高人指点。谢谢!



// WatchFile.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

void WatchDirectory(LPTSTR);


ofstream WriteLog("History.log");//创建输入流对象,并绑定log文件
//time_t ChangeTime;//用于记录修改时间的变量



int _tmain(int argc, _TCHAR* argv[])
{
wchar_t dir[]=L"e:\\MyFile\\Test";
LPTSTR Directory=(LPTSTR)dir;
_tprintf(L"%s\n",Directory);

//检查log文件是否正确打开
if(!WriteLog)
{
MessageBox(NULL,TEXT("Faild to open the file!"),TEXT("Error"),0);
return -1;
}
else
{
WatchDirectory(Directory);
}

system("pause");
return 0;
}

void WatchDirectory(LPTSTR lpDir)
{
LPCTSTR WatchDirectory=lpDir;//

//创建一个目录句柄
HANDLE in_directory=CreateFile(WatchDirectory,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if(in_directory==INVALID_HANDLE_VALUE)
{
DWORD ERROR_DIR=GetLastError();
MessageBox(NULL,TEXT("打开目录错误!"),TEXT("HelloMsg"),0);
}

FILE_NOTIFY_INFORMATION Notification;
memset(¬ification,0,sizeof(FILE_NOTIFY_INFORMATION));
DWORD BytesReturned;
BOOL watch_state;


while (TRUE)
{
watch_state=ReadDirectoryChangesW(in_directory,
(LPVOID)¬ification,
sizeof(FILE_NOTIFY_INFORMATION),
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE,
&BytesReturned,
NULL,
NULL);

if (GetLastError()==ERROR_INVALID_FUNCTION)
{
printf("系统不支持");
}
else if(watch_state==0)
{
printf("监控失败");
}
else
{
printf("%s:%d",Notification.Action,BytesReturned);//函数能检测到目录中文件变更,但是查不到任何返回的信息,这里输出该函数的返回信息字节数每次都为0,这是为什么呢?

if (Notification[0].Action==FILE_ACTION_ADDED)
{
printf("FILE_ACTION_ADDED");
}
if (Notification.Action==FILE_ACTION_REMOVED)
{
printf("FILE_ACTION_REMOVED");
}
if (Notification.Action==FILE_ACTION_MODIFIED)
{
printf("FILE_ACTION_MODIFIED");
}
if (Notification.Action==FILE_ACTION_RENAMED_OLD_NAME)
{
printf("FILE_ACTION_RENAMED_OLD_NAME");
}
if (Notification.Action==FILE_ACTION_RENAMED_NEW_NAME)
{
printf("FILE_ACTION_RENAMED_NEW_NAME");
}
}
}

}

...全文
197 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
浮生专栏 2012-07-12
  • 打赏
  • 举报
回复
问题已解决:
printf("%s:%d",Notification.Action,BytesReturned);
这句中的BytesReturned是个地址,输出得先解引用,Action是DWORD类型的值,用%d类型输出。
浮生专栏 2012-07-10
  • 打赏
  • 举报
回复
恕我愚笨,MSDN看了一天了,但是最后这个问题一直还是没有解决。如果有人知道为什么,请多多指教。[Quote=引用 5 楼 的回复:]

碰到这样的问题,第一反应是查MSDN
[/Quote]
pathuang68 2012-07-10
  • 打赏
  • 举报
回复
碰到这样的问题,第一反应是查MSDN
浮生专栏 2012-07-10
  • 打赏
  • 举报
回复
我监控的是目录,我在监控目录下修改,添加,删除文件,函数都能检测到,并顺利进入else循环,但是问题是,函数没有返回任何信息到我指定的地址(函数的第二个参数),我无法查询到底是哪个地方修改了。[Quote=引用 1 楼 的回复:]

ReadDirectoryChangesW
断点看看是否捕获到某种信息.
if (GetLastError()==ERROR_INVALID_FUNCTION)
{
printf("系统不支持");
}
else if(watch_state==0)
{
……
[/Quote]
浮生专栏 2012-07-10
  • 打赏
  • 举报
回复
怎么说?[Quote=引用 2 楼 的回复:]

CreateFile的参数好像填写错了吧?
[/Quote]
W170532934 2012-07-10
  • 打赏
  • 举报
回复
CreateFile的参数好像填写错了吧?
tanling_zero 2012-07-10
  • 打赏
  • 举报
回复
ReadDirectoryChangesW
断点看看是否捕获到某种信息.
if (GetLastError()==ERROR_INVALID_FUNCTION)
{
printf("系统不支持");
}
else if(watch_state==0)
{
printf("监控失败");
}
else
{
是否能进入到这里面来.如果进入那就是判断条件有问题.如果错误那就是ReadDirectoryChangesW 创建文件监听失败的,再看看参数是否真确.

}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧