VC++文件监控(一) ReadDirectoryChangesW

From: http://www.cnblogs.com/doublesnke/archive/2011/08/16/2141374.html

VC++实施文件监控:实例和详解

相关帮助: http://hi.baidu.com/jiahaosoft/blog/item/b441d1218eebece0d6cae274.html

我这里只介绍采用ReadDirectoryChangesW对文件目录实施监控

关键代码

?
CfgdsgDlg * dlg = (CfgdsgDlg*)lparam;
    HANDLE hDir;
    char notify[1024];
    DWORD cbBytes,i;
    char AnsiChar[3];
    wchar_t UnicodeChar[2];
    CString path;
    FILE_NOTIFY_INFORMATION *pnotify=(FILE_NOTIFY_INFORMATION *)notify;
    FILE_NOTIFY_INFORMATION *tmp;
    GetCurrentDirectory(MAX_PATH,path.GetBuffer(MAX_PATH+1));
    hDir = CreateFile( path, FILE_LIST_DIRECTORY,
        FILE_SHARE_READ |
        FILE_SHARE_WRITE |
        FILE_SHARE_DELETE, NULL,
        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS |
        FILE_FLAG_OVERLAPPED, NULL);
    if (hDir == INVALID_HANDLE_VALUE)
    {
        dlg->m_edit.ReplaceSel("hDir:INVALID_HANDLE_VALUE\r\n");
        return 0;
    }
    while (TRUE)
    {
        if(ReadDirectoryChangesW(hDir, &notify, sizeof(notify),
            FALSE, FILE_NOTIFY_CHANGE_FILE_NAME| FILE_NOTIFY_CHANGE_LAST_WRITE,
            &cbBytes, NULL, NULL))
        {
            tmp = pnotify;
            switch(tmp->Action)
            {
            case FILE_ACTION_ADDED:
                dlg->m_edit.ReplaceSel("Directory/File added (添加文件)- \r\n");
                break;
            case FILE_ACTION_REMOVED:
                dlg->m_edit.ReplaceSel("Directory/File removed (删除文件)- \r\n");
                break;
            case FILE_ACTION_MODIFIED:
                dlg->m_edit.ReplaceSel("Directory/File modified (修改文件内容)- \r\n");
                break;
            case FILE_ACTION_RENAMED_OLD_NAME:
                dlg->m_edit.ReplaceSel("Directory/File old name (修改文件名字)- \r\n");
                break;
            case FILE_ACTION_RENAMED_NEW_NAME:
                dlg->m_edit.ReplaceSel("Directory/File new name - \r\n");
                break;
            default:
                break;
            }
        }
    }

  

FILE_NOTIFY_INFORMATION //可以确定是那个文件进行的修改

typedef struct _FILE_NOTIFY_INFORMATION {
  DWORD NextEntryOffset;
  DWORD Action;//动作
  DWORD FileNameLength;//文件名字的长度
  WCHAR FileName[1];//文件名字
} FILE_NOTIFY_INFORMATION,
*PFILE_NOTIFY_INFORMATION;

ReadDirectoryChangesW 返回类型(见MSDN)

ValueMeaning

FILE_ACTION_ADDED
0x00000001

The file was added to the directory.

FILE_ACTION_REMOVED
0x00000002

The file was removed from the directory.

FILE_ACTION_MODIFIED
0x00000003

The file was modified. This can be a change in the time stamp or attributes.

FILE_ACTION_RENAMED_OLD_NAME
0x00000004

The file was renamed and this is the old name.

FILE_ACTION_RENAMED_NEW_NAME
0x00000005

The file was renamed and this is the new name.

效果如下:

不足的地方:

只能检测到指定目录和下一级目录,超过目录级数,该函数检测不到。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类

一、概述 关于LSTM同系列的前一篇文章写的是利用LSTM网络对电力负荷进行预测【LSTM预测】,其本质是sequence-to-sequence problems,序列到序列的预测应用。这里做一下sequence-to-label classification problems,序列到标签的分类应用【LSTM…

VC跨进程数据(结构体)传递-WM_COPYDATA

两个测试程序,都是MFC基于对话框的应用程序,一个是发送者,一个是接收者。 两个程序都使用同一个结构体: typedef struct {char imsi[20];char options[512]; }_tagResult;发送者:按钮点击事件: void CCa…

[react] 什么渲染劫持?

[react] 什么渲染劫持? 首先,什么是渲染劫持:渲染劫持的概念是控制组件从另一个组件输出的能力,当然这个概念一般和react中的高阶组件(HOC)放在一起解释比较有明了。 高阶组件可以在render函数中做非常多…

咨询的真相8:咨询业的“前世今生”

第四节 咨询业的奶酪究竟有多大 2001年,又是从美国,传来了一本风靡全球的畅销书,讲的是四个老鼠和一块奶酪的故事。从此,奶酪就成了众人争抢之物的代名词。美国人的创新精神不得不佩服,忒俗的一个道理经他们仅从形式上…

matlab LSTM序列分类的官方示例

matlab版本是2018b及其以上。 %% %加载序列数据 %数据描述:总共270组训练样本共分为9类,每组训练样本的训练样个数不等,每个训练训练样本由12个特征向量组成, [XTrain,YTrain] japaneseVowelsTrainData; %数据可视化 figure plo…

【MySQL】Java对SQL时间类型的操作(获得当前、昨天、前年。。时间)

Java获得当前时间1 java.util.Date date new java.util.Date(); 2 Timestamp time new Timestamp(date.getTime()); Java获得昨天的时间1 Calendar cal Calendar.getInstance(); 2 cal.add(Calendar.DATE, -1); 3 String a new SimpleDateFormat( "yyyy-MM-dd ")…

[react] 说说你对React的渲染原理的理解

[react] 说说你对React的渲染原理的理解 1.单向数据流。React是一个MVVM框架,简单来说是在MVC的模式下在前端部分拆分出数据层和视图层。单向数据流指的是只能由数据层的变化去影响视图层的变化,而不能反过来(除非双向绑定) 2.数…

MATLAB K-means聚类代码讲解

一、概述 K-means聚类采用类内距离和最小的方式对数据分类,MATLAB中自带K-means算法,最简单的调用如下: idxkmeans(x,k) 将n-by-p数据矩阵x中的数据划分为k个类簇。x的行对应数据条数,x的列对应数据的维度。注意:当…

树型控件使用

树型控件的使用: 1、设置树型控件的风格。 DWORD dwStyle GetWindowLong(m_TreeCtrl.m_hWnd, GWL_STYLE); dwStyle | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; SetWindowLong(m_TreeCtrl.m_hWnd, GWL_STYLE, dwStyle); TVS_HASBUTTONS、TVS_HASLINES等风格有很多…

带界面的OCX制作实例

制作一个有界面的OCX,并进行测试。代码下载 一、制作一个有界面的OCX: 设置该对话框的属性(关键噢): 给添加的对话框资源关联一个类CDlgTest,基类是:CDialog,如下: 给CO…

[react] componentWillUpdate可以直接修改state的值吗

[react] componentWillUpdate可以直接修改state的值吗 1: 不行,这样会导致无限循环报错。 2:在react中直接修改state,render函数不会重新执行渲染,应使用setState方法进行修改 个人简介 我是歌谣,欢迎和大家一起交流…

mysql 分组后取每个组内最新的一条数据

首先,将按条件查询并排序的结果查询出来。 1 mysql> select accepttime,user,job from tuser_job where user 8 order by accepttime desc;2 --------------------------------3 | accepttime | user | job |4 --------------------------------5 | 20…

Qt C++ 命名空间namespaces讲解

一、概述 命名空间 namespace 将一组去哪聚范围内有效的类、对象或者函数组织到一个命名的名字下边,将全局范围分割成多个子域,每个子域就叫做命名空间。作用是在大工程中避免多个类和文件出现相同的成员名称。 命名空间使用的格式为: nam…

从淘宝数据结构来看电子商务中商品属性设计

淘宝名词解释 产品 和 商品的区别: 淘宝标准化产品,由类目关键属性唯一确定。如:手机类目,关键属性是品牌和型号,Nokia N95就是一个产品,nokia是品牌,N95是型号。产品除了关键属性还包括一般信息、销售属性和非关键属性…

linux串口驱动分析

linux串口驱动分析硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)端口,每个端口都可以在中断模式或 DMA 模式下操作。UART 使用系统时钟可以支持最高 115.2Kbps 的波特率。每…

用C++实现网络编程---抓取网络数据包的实现方法

From: http://blog.csdn.net/zjl_1026_2001/article/details/2191311 做过网管或协议分析的人一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包。抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协…

二分图----最大匹配,最小点覆盖,最大点独立集

一.二分图 二分图又称作二部图,是图论中的一种特殊模型。 设G(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A…

[react] 怎么使用Context开发组件?

[react] 怎么使用Context开发组件? import React, {Component} from react// 首先创建一个 context 对象这里命名为:ThemeContext const ThemeContext React.createContext(light)// 创建一个祖先组件组件 内部使用Provier 这个对象创建一个组件 其中…

Linux 进程通信 -- 信号

一、概述 信号用于保持进程间的通信,可以备发送到一个进程或者一组进程,发送给进程的这个唯一信息通常是标志信号的一个数。信号可从键盘终端产生、虚拟内存中非法访问系统资源等情况下产生。信号异步发生,收到信号的进程可以采取某种动作或…

简单理解Socket

TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准&…