参考: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. javascript 的继承实例

    shape.prototype = { getEdge:function(){ return this.edge; }, getArea:function(){ return this.a*this. ...

  2. adb详解

    adb详解 分类: android开发工具相关 2012-10-24 18:27 2822人阅读 评论(0) 收藏 举报 ADB全称Android Debug Bridge,是android sdk里 ...

  3. 主从复制时报:ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in t

    centos 6.5 mysql5.7 在从库作stop slave时报: error:ERROR 1794 (HY000): Slave is not configured or failed to ...

  4. android的NDK和java进行本地socket通信

    关于Android应用与Framework的socket通信,相信关心这个问题的朋友们已经看过<android使用socket使底层和framework通信>这篇文章,美中不足的是作者只贴 ...

  5. iframe双滚动栏 解决方案 CSS3 overflow-y 属性

     裁剪 div 元素中内容的左/右边缘 - 假设溢出元素的内容区域的话: div { overflow-y:hidden; } <!DOCTYPE html> <html> ...

  6. mysql lower_case_table_names ---- 一律把表名处理为小写

    一.从操作系统说起: 1.我们知道mysql 是跨平台的.它可以在许多平台上运行如windows .linux.unix(mac).linux 是类unix的, 但是windows和linux就有非常 ...

  7. maven optional可选依赖

    应用场景:projectA 依赖projectB,  projectB 依赖projectC时 <dependency> <groupId>com.itear.projectC ...

  8. C++ virtual继承

    C++ virtual继承的还有一种名称是菱形继承.主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝.造成数据不统一的问题,以致于在进行类释放时造成内存泄漏. 将共同的基类作为虚基类 ...

  9. Java Mail(一):telnet实现发送收取邮件

    http://blog.csdn.net/ghsau/article/details/8602076 ******************************* 最近要做一个解析邮件的东东,就顺便 ...

  10. MDI多文档窗体续

    private void 加载窗体_Click(object sender, EventArgs e) { Form2 frm = new Form2();//实例化 Form2 frm.MdiPar ...