参考: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     = ,           //添加了文件/目录
,           //删除了文件/目录
,           //更改了文件/目录
            //重命名了文件/目录
};

//定义文件/目录改变后的回调函数指针
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 );
    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, );
    if(WAIT_TIMEOUT == dwRet)
    {
        ASSERT( m_hThread != NULL );
        ::TerminateThread(m_hThread, -);
    }

::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 );

};
    FILE_NOTIFY_INFORMATION *pNotify = (FILE_NOTIFY_INFORMATION *)szBuf;
    DWORD dwBytesReturned = ;

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 / ] = L'\0';

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

;
}

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

VC++ 监视文件(夹)的更多相关文章

  1. 图解SSIS监视文件夹并自动导入数据

    原文:图解SSIS监视文件夹并自动导入数据 演示案例:让系统自动监视文件夹,并把文件夹下面的excel文件导入到sql中,之后清空目录.这个过程以往都需要写程序来实现或者定时执行,现在可以用ssis来 ...

  2. SSIS-WMI监视文件夹

    在文档交互数据时,通常会排个job每隔几分钟执行来解析文档,但是jOb不能排的太频繁了,所以文档不能及时的被解析. 在SSIS中可以使用WMI这个组件来监视文件夹,一旦有新文档丢入就马上执行解析程序, ...

  3. VC.遍历文件夹中的文件

    1.VC下遍历文件夹中的所有文件的几种方法 - 年少要轻狂 - CSDN博客.html(https://blog.csdn.net/wllmsdn/article/details/27220999) ...

  4. VC++ 统计文件夹下面的当日和本月生成的图片

    void GetCapNum(int * todayNum, int * mouthNum) {    string path = ".\\res";//路径位于程序运行目录下的r ...

  5. VC++ 遍历文件夹

    }; strcpy_s(szFind, MAX_PATH, m_szDir); strcat_s(szFind, "\\*.*"); WIN32_FIND_DATA wfd; HA ...

  6. apache commons vfs 文件夹监控

    package test.vfs; import java.io.File; import org.apache.commons.logging.Log; import org.apache.comm ...

  7. 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了

    当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成.不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”. 那 ...

  8. windows下使用RoboCopy命令进行文件夹增量备份

    RoboCopy,它是一个命令行的目录复制命令,自从Windows NT 4.0 开始就成为windows 资源工具包的一部分,然后在Windows Vista.Windows 7和 Windows ...

  9. VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答

    用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...

随机推荐

  1. Wince6.0模拟器下载和使用方法

    原文地址:http://www.oogps.com/post/Wince6.0.html下载地址:Wince6.0模拟器下载.rar 第一步:把软件下载解压后看到以下目录. 第二步:双击运行上图中的S ...

  2. DP SRM 661 Div2 Hard: ColorfulLineGraphsDiv2

    Problem Statement Bob is going to create a graph with N nodes. The graph will be constructed in two ...

  3. Android 5.0最应该实现的8个期望

    毫无疑问,Android 5 将是令人兴奋的操作系统,因为 Android4.0 至 4.4 版本之间并没有显著的差异,显然谷歌会在 5.0 版本中进行一些较大幅度的革新.那么,代号为“柠檬芝士蛋糕” ...

  4. android 实现全屏代码

    设置全屏包括两个部分: 窗口全屏和Activity全屏. 窗口全屏 是指隐藏系统顶部用来显示时间.电量.信号等信息的标题栏 . Activity全屏 是指隐藏程序的标题栏.我们可以通过修改Androi ...

  5. 【Android UI设计与开发】使用ViewPager实现欢迎引导页面

    一.实现的效果图 每次看别人的代码前,必需要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实现的效果类似.有图才有真相嘛,同一时候,最下方有源代码的下载地址,差点儿源代码的每一行都有凝视,写 ...

  6. Guid.NewGuid().ToString()得几种格式显示

    1.Guid.NewGuid().ToString("N") 结果为:        38bddf48f43c48588e0d78761eaa1ce6 2.Guid.NewGuid ...

  7. vsftpd問題集

    vsftpd无法看到文件:226 Transfer done (but failed to open directory). 原因:目录不是一个 world_readable目录 解决方法:在配置文件 ...

  8. 简洁经常使用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法

    权限系统.Web开发常见标准子系统之中的一个.结合自己的一些思考和实践,从本篇開始权限系统的设计与实现之路. 近期,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇.仅仅是大致介 ...

  9. JQuery实现选择特定楼层回复

    JQuery实现选择特定楼层回复 需求: 一个论坛里面的小功能,除了回复帖子之外,也能够回复帖子以下的回复.详细实现细节: 每个回复有一个"回复"按钮,点击按钮实现: 在form表 ...

  10. 使用c++的cocos2d-x-3.0rc1程序公布apk

    (如今cocos2dx-x-3.0正式版已经出了.之前用的cocos2d-x-3.0rc1,就先用这个版本号吧) 0. 完毕C++项目 在cmd下使用cocos.py new命令,然后习惯性的在win ...