工控编程吧
标题:
217上位机VC MFC监视指定文件夹内文件操作
[打印本页]
作者:
qq263946146
时间:
2016-2-28 12:16
标题:
217上位机VC MFC监视指定文件夹内文件操作
(, 下载次数: 3)
上传
点击文件名下载附件
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//记得添加
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/dd262708ce2bd5cdb6b2ecdee5dfd6a9/0/0/w_19rszs2nst.swf-albumId=5381688209-tvId=5381688209-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4