参考: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. knockoutjs -- applyBinding & Observables

    applyBindings ko.applyBindings(myViewModel); // Knockout调用applyBindings激活myViewModel(即把myViewModel和V ...

  2. Adminer - 类似于phpMyAdmin的MySQL管理客户端

    Adminer是一个类似于phpMyAdmin的MySQL管理客户端.整个程序只有一个PHP文件,易于使用和安装.Adminer支持多语言(已自带11种翻译语言文件,可以按自己的需求翻译相应的语言). ...

  3. 编程算法 - 翻转单词顺序 代码(C)

    翻转单词顺序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个英文句子, 翻转句子中单词的顺序, 但单词内字符的顺序不变. 首先翻转(r ...

  4. Linux配置 xampp下的https证书(腾讯云申请)

    准备 从腾讯云后台SSL证书管理里下载证书 一.上传文件 解压出来以后有三个文件: 1_root_bundle.crt 2_www.xxxxx.com.crt 3_www.xxxxx.com.key ...

  5. IT路上的应该注意自我规划 学习规划与自我修炼

    http://www.nowamagic.net/librarys/veda/detail/607 IT路漫漫,你需要明确自己所处的位置,并作出相应的规划,这条路才能够走得更加顺畅.下面是参考: 初学 ...

  6. HTML5 学习笔记 表单属性

    HTML5新的表单属性 HTML5 的form和input 标签添加了几个新的属性 <form>新属性 autocomplete novalidate input 新属性 autocomp ...

  7. 【web开发学习笔记】Struts-Tags学习笔记1 - 通用标签和控制标签

    通用标签和控制标签 第一部分.代码 //前端 <html> <head> <meta http-equiv="Content-Type" conten ...

  8. C# ManualResetEvent

    文章转载自:C# ManualResetEvent ManualResetEvent被用于在两个或多个线程间进行线程信号发送. 多个线程可以通过调用ManualResetEvent对象的WaitOne ...

  9. Node.js + Express + Ubuntu

    1 . 怎么在ubuntu中,background的方式 启动express. 网站www /home/host/express/web/bin# nohup node www 2. Node.js的 ...

  10. java Arrays对数组操作

    Arrays.sort(Array)对数组排序 public static void main(String[] args) throws IOException { int[] a = {1,3,9 ...