217上位机VC MFC监视指定文件夹内文件操作
217上位机VC MFC监视指定文件夹内文件操作 功能展示 有时我们不想某一文件夹内文件被用户修改,我们就得监视此文件夹,当用户修改了文件夹内的文件时,我们监视到后就可以做出进一步的处理,当前例程实现指定文件夹的监视,会将所监视到的操作全部罗列出来,显示在列表框中,效果如图; 要点提示 监视指定文件夹可以使用函数ReadDirectoryChangesW() 函数原型和参数说明为: BOOL ReadDirectoryChangesW( HANDLE hDirectory, //对目录进行监视的句柄 LPVOID lpBuffer, //指向DWORD类型的缓冲区,其中可以将获取的数据结果将其返回 DWORD nBufferLength, //指lpBuffer的缓冲区的大小值,以字节为单位 BOOL bWatchSubtree, //监视目录. 一般选择 TRUE DWORD dwNotifyFilter, //对文件过滤的方式和标准,有众多选择可以查阅MSDN手册或例程源码 LPDWORD lpBytesReturned, // 将接收的字节数转入lpBuffer参数 LPOVERLAPPED lpOverlapped, // 异步IO结构体指针,一般选择 NULL LPOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine// 完成用函数指针 一般选择 NULL ); 文件夹的监视得连续不间断进行,例程中开启一线程进行监控,避免了程序界面的假死现象; 实现功能 1.新建基于对话框的应用程序 2.拖拽按钮<选择要监视文件夹><开始监视><停止监视>关联函数,添加一编辑框ID为IDC_EDIT1,用于显示要监视的文件夹路径,添加一列表框控件ID为IDC_LIST1用于显示监视的结果; 在主对话框中添加变量private: int m_nIndex;//事件的索引CString m_sDir;//要监视文件夹目录 HANDLE m_hDir;//要监视的打开的文件夹名柄 HANDLE m_hThread;//线程句柄 在对话框的OnInitDialog()函数中初始化m_nIndex=0;//文件夹发生事件索引 CListCtrl* pListCtrl =(CListCtrl*)GetDlgItem(IDC_LIST1); pListCtrl->ModifyStyle(LVS_TYPEMASK,LVS_REPORT); pListCtrl->SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_FLATSB|LVS_EX_TWOCLICKACTIVATE|LVS_EX_GRIDLINES); pListCtrl->InsertColumn(0,"索引",LVCFMT_LEFT,40); pListCtrl->InsertColumn(1,"时间",LVCFMT_LEFT,80); pListCtrl->InsertColumn(2,"事件类型",LVCFMT_LEFT,100); pListCtrl->InsertColumn(3,"事件内容",LVCFMT_LEFT,500); 3.添加自定义函数void MoniterFolder();用于监视指定的文件夹,此函数体部分可在例程中查看; 下面是按钮的代码部分 - void CGkbc8Dlg::OnStop()
- {
- if(m_hThread !=NULL)
- {
- ::TerminateThread(m_hThread, 0 );
- m_hThread = NULL;
- }
-
复制代码- if(m_hDir !=INVALID_HANDLE_VALUE)
- {
- CloseHandle( m_hDir );
- m_hDir = INVALID_HANDLE_VALUE;
- }
- }
- void CGkbc8Dlg::OnStart()
- {
- if(m_sDir.IsEmpty())
- return;
- DWORD ThreadId; //创建一个新线程用于监视
- m_hThread=::CreateThread(NULL,0,ThreadProc,this,0,&ThreadId );
- } void CGkbc8Dlg::OnChoose()
- {
- BROWSEINFO bif;
- char buf[MAX_PATH];
- ZeroMemory(&bif,sizeof(BROWSEINFO));
- bif.hwndOwner=m_hWnd;
- bif.lpszTitle="选择文件夹";
- bif.pszDisplayName=buf;
- bif.ulFlags=BIF_EDITBOX;
- LPITEMIDLIST pil;
- pil=SHBrowseForFolder(&bif);
- if(pil!=NULL)
- {
- SHGetPathFromIDList(pil,buf);
- m_sDir=buf;
- SetDlgItemText(IDC_EDIT1,buf);
- }
- }
复制代码再在程序退出时 调用一次OnStop(); //终止线程以及在stdafx.h头文件中添加代码#define _WIN32_WINNT 0x0500//记得添加 我们来演示下功能实现的整个过程
|