当前位置: 首页 > news >正文

VC++ 监视文件(夹)

  参考:http://www.cnblogs.com/fangkm/archive/2009/03/31/1426526.html

  WinFileSystemMonitor.h

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
#pragma  once

// 文件目录改变的类型
enum  tagACTION 

    Added     = 
1 ,            //添加了文件/目录
    Removed   =  2 ,            //删除了文件/目录
    Modified  =  3 ,            //更改了文件/目录
    Renamed   =  4              //重命名了文件/目录
};

//定义文件/目录改变后的回调函数指针
typedef    void (*lpFunDealFile)(tagACTION action, LPCTSTR lpszFileSrc, LPCTSTR lpszFileDst);


class  CWinFileSystemMonitor
{

public :
    CWinFileSystemMonitor();
    ~CWinFileSystemMonitor();

    
/*
    * 设置回调函数
    */

    
void  SetDealFilePtr( lpFunDealFile pFunDeal );

    
/*
    * 开启监视
    */

    BOOL StartMonitor( LPCTSTR lpszDir );

    
/*
    * 停止监视
    */

    
void  EndMonitor();

    
/*
    * 正在监视?
    */

    BOOL IsMoniting();
    
    
/*
    * 回调函数
    */

    
static   void  ActionProcess(tagACTION action, LPCTSTR lpszFileSrc, LPCTSTR lpszFileDst);

private :
    
//监视文件/目录句柄
    HANDLE  m_hDir;

    
//继续监视
     volatile  BOOL m_bContinue;
    
    
//监视线程句柄
    HANDLE  m_hThread;
    
    
//回调指针
    lpFunDealFile m_pFunDeal;

    
//监视线程处理函数
     static  DWORD WINAPI MonitorProc( LPVOID lParam );

};

  WinFileSystemMonitor.cpp

 

 

 

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 
#include   "WinFileSystemMonitor.h"

CWinFileSystemMonitor::CWinFileSystemMonitor(
void )
{
    m_hDir       =  
NULL ;
    m_bContinue  =  FALSE;
    m_hThread    =  
NULL ;
}

CWinFileSystemMonitor::~CWinFileSystemMonitor(
void )
{
}

void  CWinFileSystemMonitor::SetDealFilePtr(lpFunDealFile pFunDeal)
{
    ASSERT( pFunDeal != 
NULL  );
    m_pFunDeal = pFunDeal;
}

BOOL CWinFileSystemMonitor::StartMonitor( LPCTSTR lpszDir )
{
    ASSERT( m_hThread == 
NULL  );

    HANDLE hDir = ::CreateFile(lpszDir,
                               GENERIC_READ | FILE_LIST_DIRECTORY,
                               FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                               
NULL ,
                               OPEN_EXISTING,
                               FILE_FLAG_BACKUP_SEMANTICS,
                               
NULL );
    
if (INVALID_HANDLE_VALUE == hDir)
    {
        
return  FALSE;
    }

    m_hDir = hDir;
    m_bContinue = TRUE;
    m_hThread = ::CreateThread( 
NULL 0 , MonitorProc,  this 0 NULL  );
    
if ( NULL  != m_hThread)
    {
        SetDealFilePtr(ActionProcess);
    }
    
return  ( NULL  == m_hThread ) ? FALSE : TRUE;
}

void  CWinFileSystemMonitor::EndMonitor()
{
    ASSERT( m_hThread != 
NULL  );
    m_bContinue = FALSE;
    DWORD dwRet = ::WaitForSingleObject(m_hThread, 
1000 );
    
if (WAIT_TIMEOUT == dwRet)
    {
        ASSERT( m_hThread != 
NULL  );
        ::TerminateThread(m_hThread, -
1 );
    }

    ::CloseHandle(m_hDir);
    m_hDir = 
NULL ;
    m_hThread = 
NULL ;

}

BOOL CWinFileSystemMonitor::IsMoniting()
{
    
return  m_bContinue;
}

DWORD WINAPI CWinFileSystemMonitor::MonitorProc( LPVOID lParam )
{
    CWinFileSystemMonitor *pThis = (CWinFileSystemMonitor *)lParam;
    ASSERT( pThis != 
NULL  );

    
char  szBuf[  2  * (  sizeof  ( FILE_NOTIFY_INFORMATION ) + MAX_PATH ) ] = { 0 };
    FILE_NOTIFY_INFORMATION *pNotify = (FILE_NOTIFY_INFORMATION *)szBuf;
    DWORD dwBytesReturned = 
0 ;

    
while ( pThis->m_bContinue )
    {
        
if ( !::ReadDirectoryChangesW(pThis->m_hDir,
                                     pNotify,
                                     
sizeof (szBuf),
                                     TRUE,
                                     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  ) )
        {
            
break ;
        }
        
else
        {
            WCHAR *pszFileDst = 
NULL ;
            WCHAR *pszFileSrc = pNotify->FileName;
            pszFileSrc[pNotify->FileNameLength / 
2 ] = L '\0' ;

            
if ( 0  != pNotify->NextEntryOffset)
            {
                PFILE_NOTIFY_INFORMATION pNext = (PFILE_NOTIFY_INFORMATION)((
char  *)pNotify + pNotify->NextEntryOffset);
                pszFileDst = pNext->FileName;
                pszFileDst[pNext->FileNameLength / 
2 ] = L '\0' ;
            }
            
if ( NULL  != pThis->m_pFunDeal)
            {
                pThis->m_pFunDeal((tagACTION)pNotify->Action, CW2T(pszFileSrc), CW2T(pszFileDst));
            }
        }
    }

    
return   0 ;
}

void  CWinFileSystemMonitor::ActionProcess( tagACTION action, LPCTSTR lpszFileSrc, LPCTSTR lpszFileDst )
{
    
switch  (action)
    {
    
case  Added:
        AfxMessageBox(_T(
"Added!" ));
        
break ;
    
case  Removed:
        AfxMessageBox(_T(
"Removed!" ));
        
break ;
    
case  Modified:
        AfxMessageBox(_T(
"Modified!" ));
        
break ;
    
case  Renamed:
        AfxMessageBox(_T(
"Renamed!" ));
        
break ;
    
default :
        
break ;
    }
}

  一个Demo,仅供参考,欢迎改进!

  

   百度云下载:http://pan.baidu.com/s/1c6c4eM 密码:t5a4

相关文章:

  • 7-angular.extend
  • 通过mysql-proxy映射外网访问内网数据库
  • DocX开源WORD操作组件的学习系列二
  • js获取屏幕大小,元素top值等等
  • STM32中assert_param的使用
  • sass/scss 和 less的区别
  • c#时间格式
  • Kali Linux Wine32英文字体不显示问题
  • Redirect和Forward
  • Android View 事件分发机制 源代码解析 (上)
  • 配置maven
  • NumPy 中的线性代数
  • 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现
  • 装修除甲醛,这些方法真有那么神奇吗?
  • 正则表达式之基本概念
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Apache Pulsar 2.1 重磅发布
  • C++11: atomic 头文件
  • CSS 三角实现
  • js递归,无限分级树形折叠菜单
  • Leetcode 27 Remove Element
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Tornado学习笔记(1)
  • Yeoman_Bower_Grunt
  • 给第三方使用接口的 URL 签名实现
  • 使用 Docker 部署 Spring Boot项目
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 想写好前端,先练好内功
  • 新书推荐|Windows黑客编程技术详解
  • 运行时添加log4j2的appender
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $NOIp2018$劝退记
  • (02)vite环境变量配置
  • (C)一些题4
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)JAVA使用POI操作excel
  • (二十四)Flask之flask-session组件
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (五)c52学习之旅-静态数码管
  • (已解决)什么是vue导航守卫
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .form文件_SSM框架文件上传篇
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • /etc/fstab和/etc/mtab的区别
  • @Autowired和@Resource的区别
  • @RestControllerAdvice异常统一处理类失效原因