- 浏览: 257853 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- mysql (5)
- boost (6)
- 工具 (10)
- IT生活 (7)
- 多线程 (3)
- Ruby (15)
- php (2)
- MongoDB (39)
- 移动互联网 (2)
- 测试 (8)
- c++ (28)
- 书 (1)
- 网站 (3)
- 网络编程 (14)
- 开源软件 (1)
- 分布式计算 (1)
- 得得得 (1)
- php,wordpress (1)
- error (5)
- 编译 (2)
- 学习 (1)
- 杀毒软件 (1)
- dd (0)
- linux (21)
- 数据库 (1)
- STL (1)
- c++/c (5)
- 软件设计 (1)
- 操作系统 (4)
- 库 (2)
- win32 (1)
- s (0)
- openssl (1)
- perl (2)
- debug (1)
- windows (4)
- python (12)
- windows 防火墙 (1)
- vs (1)
- vim (2)
- vc (1)
- 浏览器插件的危害 (1)
- curl (0)
- 判断手机号码合法性的库 (0)
- 地址备注 (0)
- 安装 File::Slurp (1)
- cenos (2)
- shell (1)
- linunx (1)
- internet (1)
- software (1)
- widows (1)
- linux io (1)
- nginx (2)
- 算法 (2)
- google (1)
- protobuf (2)
- tengine (1)
- tools (1)
- lua (2)
- liunx (1)
- vcard (1)
- lua-iconv (1)
- 网络 (2)
- teat (0)
- ldconfig linux (0)
- awk (0)
- grep (0)
- windws (2)
- linux 命令 (1)
- tcp dump (1)
- vmware (1)
- question2answer (2)
- mongdb (1)
- 正则 (1)
- OCR (2)
- Windows Server (1)
最新评论
转自:http://www.cnblogs.com/yimins/archive/2010/05/18/1738379.html
这两天又研究了一下ReadDirectoryChangesW函数,下面大致的将研究所得的一些心得体会拿出来和大家分享一下。
首先这个函数的作用,主要是用于监控某个目录下文件或目录的改动事件。那么究竟这个函数是怎么运作的呢,我打一个比较容易理解的比方给大家。
我们的应用程序就好比是茫茫大海上一个小小的灯塔,灯塔上有一个观察员(只有一个哦,原因?VB天生的单线程!)ReadDirectoryChangesW函数就好比一副望远镜,观察员的任务有如下三项:
1、通过望远镜观察海上经过的船只(相当于调用主函数进行文件监视)
2、记录下相应的船只名称(处理和记录得到的文件名)
3、和用户聊天。(-_-!!!其实就是负责与用户界面交互)
由此可见,我们可怜的观察员其实是分身乏术的,尤其是工作3是不能轻易中断的,一旦观察员停止与用户交互,用户第一个反应就是:什么破程序,又卡死了!!!
有点扯远了,我们言归正传,除聊天之外观察员的正式工作就是盯着望远镜(调用ReadDirectoryChangesW),一旦看到船只经过,立即在纸上抄下船只的名称(记录下被改动的文件名)。这就是ReadDirectoryChangesW函数在同步模式下的工作过程。缺点有两个:1、观察员专心观察,无法和用户聊天。(主窗体失去响应)2、当观察员低下头记录名称的时候,有可能有个别船只会偷偷溜过去。(文件改动事件丢失)
知道了原因那么解决方式也很简单了,首先我们必须用多线程,再请一个观察员,专门负责盯着望远镜,主线程则负责和用户聊聊天就好了。第二个问题我们采用另一种方法,当观察员见到船只经过的时候,并不进行记录工作,而只是简单的给整个船体拍张照片,然后交给主线程,主线程负责看着照片记录船只名称。因为记录名称的工作并不是非常消耗时间,所以可以在聊天的间隙进行。当然,这样还会带来另一个小小的问题,你的照相机有多少空间,毕竟照相比仅仅记录一个名字要浪费许多空间。
最后,再解释另一个可能造成丢失事件的原因。由于每次经过的船可能不止一艘,可能会有小船躲在大船后面溜过去,不过这个其实不是问题,因为ReadDirectoryChangesW函数返回的是所有船只的信息,其实是一个链表结构,我们只要顺藤摸瓜将后面的船只也抓出来并进行记录即可。
代码例子:
这两天又研究了一下ReadDirectoryChangesW函数,下面大致的将研究所得的一些心得体会拿出来和大家分享一下。
首先这个函数的作用,主要是用于监控某个目录下文件或目录的改动事件。那么究竟这个函数是怎么运作的呢,我打一个比较容易理解的比方给大家。
我们的应用程序就好比是茫茫大海上一个小小的灯塔,灯塔上有一个观察员(只有一个哦,原因?VB天生的单线程!)ReadDirectoryChangesW函数就好比一副望远镜,观察员的任务有如下三项:
1、通过望远镜观察海上经过的船只(相当于调用主函数进行文件监视)
2、记录下相应的船只名称(处理和记录得到的文件名)
3、和用户聊天。(-_-!!!其实就是负责与用户界面交互)
由此可见,我们可怜的观察员其实是分身乏术的,尤其是工作3是不能轻易中断的,一旦观察员停止与用户交互,用户第一个反应就是:什么破程序,又卡死了!!!
有点扯远了,我们言归正传,除聊天之外观察员的正式工作就是盯着望远镜(调用ReadDirectoryChangesW),一旦看到船只经过,立即在纸上抄下船只的名称(记录下被改动的文件名)。这就是ReadDirectoryChangesW函数在同步模式下的工作过程。缺点有两个:1、观察员专心观察,无法和用户聊天。(主窗体失去响应)2、当观察员低下头记录名称的时候,有可能有个别船只会偷偷溜过去。(文件改动事件丢失)
知道了原因那么解决方式也很简单了,首先我们必须用多线程,再请一个观察员,专门负责盯着望远镜,主线程则负责和用户聊聊天就好了。第二个问题我们采用另一种方法,当观察员见到船只经过的时候,并不进行记录工作,而只是简单的给整个船体拍张照片,然后交给主线程,主线程负责看着照片记录船只名称。因为记录名称的工作并不是非常消耗时间,所以可以在聊天的间隙进行。当然,这样还会带来另一个小小的问题,你的照相机有多少空间,毕竟照相比仅仅记录一个名字要浪费许多空间。
最后,再解释另一个可能造成丢失事件的原因。由于每次经过的船可能不止一艘,可能会有小船躲在大船后面溜过去,不过这个其实不是问题,因为ReadDirectoryChangesW函数返回的是所有船只的信息,其实是一个链表结构,我们只要顺藤摸瓜将后面的船只也抓出来并进行记录即可。
代码例子:
//监控主文件夹变化 string dir = "d:\\test\\"; HANDLE dwRootDirChangeHandle = CreateFileA( dir.c_str(), /* pointer to the file name */ FILE_LIST_DIRECTORY, /* (this is important to be FILE_LIST_DIRECTORY!) access (read-write) mode */ FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, /* (file share write is needed, or else user is not able to rename file while you hold it) share mode */ NULL, /* security descriptor */ OPEN_EXISTING, /* how to create */ FILE_FLAG_BACKUP_SEMANTICS, /* file attributes */ NULL /* file with attributes to copy */ ); if (dwRootDirChangeHandle == INVALID_HANDLE_VALUE) { printf("error: %d", GetLastError()); return 0; } char notify[1024]; memset(notify, 0, 1024); DWORD cbBytes; FILE_NOTIFY_INFORMATION *pNotify=(FILE_NOTIFY_INFORMATION *)notify; char str1[MAX_PATH], str2[MAX_PATH]; while ( XSleep(10) ) { if(ReadDirectoryChangesW(dwRootDirChangeHandle, ¬ify, sizeof(notify), FALSE, FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_DIR_NAME/*FILE_NOTIFY_CHANGE_LAST_WRITE*/, &cbBytes, NULL, NULL)) { int i = 0; memset(str1, 0, MAX_PATH); WideCharToMultiByte( CP_ACP,0,pNotify->FileName, pNotify->FileNameLength/2, str1,99,NULL,NULL ); switch(pNotify->Action) { case FILE_ACTION_ADDED: printf("New Folder: %s\n", str1); break; case FILE_ACTION_MODIFIED: printf("The file was modified. This can be a change in the time stamp or attributes.\n"); break; case FILE_ACTION_REMOVED: printf("The file was removed from the directory.\n"); break; case FILE_ACTION_RENAMED_NEW_NAME: printf("The file was renamed and this is the new name.\n"); break; case FILE_ACTION_RENAMED_OLD_NAME: printf("The file was renamed and this is the old name.\n"); break; default: printf("Unknown command.\n"); } // if( 0 != pNotify->NextEntryOffset && (pNotify->FileNameLength > 0 && pNotify->FileNameLength < MAX_PATH)) // { // PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset); // memset( str2, 0, sizeof(str2) ); // WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,str2,99,NULL,NULL ); // cout << str2 << endl; // } } } ::CloseHandle(dwRootDirChangeHandle);
发表评论
-
c++ 读取unicode文档
2015-02-09 16:12 912int ReadOneNameFile(char *fil ... -
http://curl.haxx.se/
2013-06-13 17:41 0http://curl.haxx.se/ -
[转]线程本地存储(Thread Local Storage, TLS)分析与使用
2013-05-03 16:53 766线程本地存储(Thread Local Storage, TL ... -
C/C++获得windows版本
2012-12-01 11:05 1393MSDN上有详细介绍,做个标记: #include & ... -
[转]异常处理与MiniDump详解(4) MiniDump
2012-10-24 14:46 923异常处理与MiniDump详解(4) MiniDump wri ... -
禁用系统硬错误消息对话框
2012-08-31 19:14 684http://support.microsoft.com/kb ... -
Application Crash Dump Analysis (Windows 7)
2012-08-28 09:39 0Application Crash Dump Analysis ... -
如何成为一个windows程序debug高手
2012-08-18 14:40 0minidump: http://blog.csdn.ne ... -
Boost库编译后命名方式
2012-05-17 10:29 1276Boost官网的《Geting Started ... -
geoIP
2012-05-14 12:38 0http://www.oschina.net/code/sni ... -
vs2010 断点 无法命中
2012-05-07 16:13 1310这种情况不解决办法有 很多。你这个方法我没用过。最简单的方法就 ... -
$err,hr
2012-05-04 20:43 839在Visual C++ 中,可以在监视窗口添加 $err,hr ... -
WINDOWS下线程同步探讨
2012-04-11 15:04 915概述 线程同步可 ... -
undefined reference to 'pthread_create'问题解决
2012-03-30 11:43 0由于是Linux新手,所以现在才开始接触线程编程,照着GUN/ ... -
linux 下 遍历文件夹下的内容
2012-03-29 19:43 0// only works in cpp #ifdef __c ... -
用 _findfirst 和 _findnext 查找文件,遍历文件夹
2012-03-30 11:39 1978标签: _findfirst _findnext 杂谈 分类: ... -
我的广告
2012-03-19 10:57 0http://www.webweb.com/signup.as ... -
服务器多服务器设置
2012-03-12 18:01 718当服务器功能比较多时,可以抽象出一个代理,将不同的服务 ... -
记录个函数 strstr
2012-03-10 11:30 983包含文件:string.h 函数名: strstr 函 ... -
boost 序列化
2012-03-09 13:40 2647在用boost 二进制序列化类的时候,需要注意动态调用文件打开 ...
相关推荐
将ReadDirectoryChangesW函数利用重叠IO技术单独封装成线程类,完美的实现了目录文件变更的监控(支持UNC路径监控),CPU和内存占用低,无数据丢失项,使用简单方便,可以自行修改扩展功能。代码简洁容易理解。
监控文件夹改变,使用了ReadDirectoryChangesW函数
支持监控多文件的同时拷贝,使用boost库。
主要学习完成端口模型!其次就是尝试使用 ReadDirectoryChangesW进行目录监控
此类包装ReadDirectoryChangesW。
windows下文件的监控--ReadDirectoryChangesW函数的使用
主要介绍文件监控的另一种实现方式,利用ReadDirectoryChangesW来实现文件的监控,希望对大家有帮助
VC 实时监视文件夹中文件操作,如文件的删除,增加,重命名,修改等。例子为VS2005下控制台程序,浅显易懂
监视文件夹动态,有变动或更改时进行记录,同时复制或备份或能。采用VB.NET源码编写。 监视文件夹动态,有变动或更改时进行记录,同时复制或备份或能。采用VB.NET源码编写
监视文件夹变化,使用ReadDirectoryChangesW()函数,同时使用IOCP方式,效率高。
因为ReadDirectoryChangesW 上次测试发现不能多级目录监控,所以尝试用FindFirstChangeNotification来实施文件监控,需要的朋友可以参考下
使用WINDOWNS API开发的视频程序,该DEMO程序只实现了实时监控部分。希望能应用到。
ReadDirectoryChanges 受jimbeveridge的艺术启发! 该项目显示了如何通过Windows平台上的IO完成端口读取目录更改。 有关更多详细信息,请参见 。
ReadDirectoryChangesW 完成例程 异步模式的小demo, 监控函数在单独的线程中运行,不会阻塞主程序,没有添加信息过滤,会在控制台打印出所有的过程
采用ReadDirectoryChangesW实现的windows文件夹监控。
vc 目录监视 ,监视目录,监视目录一切事件,呵呵,了不起吧
用完成端口和 ReadDirectoryChangesW 监控文件夹中的文件变化,实时显示在列表上,支持大量文件同时操作
1: 备份程序, 实际上是一个windows后台程序, 使用Windows API ReadDirectoryChangesW监视特定目录, 并将该目录下的文件备份到backup目录,并记录日志 2: windows服务程序,负责启动和守护"备份程序",若发现备份程序宕...
最近学Windows shell外壳,偶然发现了SHChangeNotifyRegister这个神奇的函数,于是便用它写了个例程。 本帖不少思想来自帖子:未公开Windows API SHChangeNotifyRegister实现文件监控 基本介绍: 在Windows实现文件...