工控编程吧
标题:
216上位机VC MFC移动硬盘U盘自动打开与复制文件夹
[打印本页]
作者:
qq263946146
时间:
2016-2-28 12:13
标题:
216上位机VC MFC移动硬盘U盘自动打开与复制文件夹
(, 下载次数: 1)
上传
点击文件名下载附件
216上位机VC MFC移动硬盘U盘自动打开与复制文件夹
功能展示
移动硬盘和U盘插入时一些病毒会自动打开U盘复制病毒文件,我们当前例程也可以实现在U盘插入电脑时自动打开U盘,并向U盘复制文件或文件夹,效果如图;
要点提示
系统检测到移动硬盘或U盘的插入与拔出等操作都会向应用程序发送消息WM_DEVICECHANGE,所以我们在自己的应用程序中映射此消息就可检测移动硬盘或U盘的插入与拔出动作,进而打开或复制文件;在MFC中与此消息关联的函数是afx_msg BOOLOnDeviceChange( UINT nEventType, DWORD dwData );此函数在前几例程已具体 做过介绍;
打开U盘可以用例程的这种形式打开ShellExecute(NULL,“Open”,m_sUDist,NULL,NULL,SW_SHOWNORMAL);m_sUDist为U盘的盘符,形式为H:\ ;
实现功能
1.新建基于对话框的应用程序
2.拖拽编辑框IDC_EDIT1及按钮<浏览要复制到U盘文件夹>用于选择要复制到U盘的文件夹,
再添加按钮<打开U盘><复制上面指定文件夹到U盘>实现U盘打开与复制文件功能;
3.添加自定义函数 BOOLCopyFolder(CString sFromDir,CString sToDir,BOOL bCreateDir=TRUE);实现 向U盘复制文件功能
BOOL CGkbc8Dlg::CopyFolder(CString sFromDir,CString sToDir,BOOL bCreateDir)
{
if(bCreateDir)
if(!::CreateDirectory(sToDir,NULL))
return FALSE;
CString sTemp;//路径改为\*.*形式
if(sFromDir.Right(1)!="\")
sTemp.Format("%s\\*.*",sFromDir);
else
sTemp.Format("%s*.*",sFromDir);
BOOL bResult=TRUE;
CFileFind findfile;
BOOL bfind=findfile.FindFile(sTemp);
while(bfind)
{
bfind=findfile.FindNextFile();
if(findfile.IsDirectory()&&!findfile.IsDots())//是文件夹时迭代复制
{
if(sToDir.Right(1)!='\\')
sToDir+='\\';
if(S_OK==CopyFolder(findfile.GetFilePath(),sToDir+findfile.GetFileName()) )
bResult=TRUE;
else
bResult = FALSE;
}
复制代码
else//是文件时复制
{
if(sToDir.Right(1)!='\\')
sToDir+='\\';
if(::CopyFile(findfile.GetFilePath(),sToDir+findfile.GetFileName(),FALSE) )
bResult=TRUE;
else
bResult = FALSE;
//还可以用函数::MoveFile()移动文件
}
}
return bResult;
}
复制按钮函数:
void CGkbc8Dlg::OnCopy()
{
CString sFromDir;
CString sToDir(m_sUDist);
GetDlgItemText(IDC_EDIT1,sFromDir);
if(sFromDir.IsEmpty()||m_sUDist.IsEmpty())
return;
sToDir += sFromDir.Right(sFromDir.GetLength()-sFromDir.ReverseFind('\\')-1);
if(CopyFolder(sFromDir,sToDir))
MessageBox("复制文件夹成功");
}浏览要复制到U盘文件夹按钮函数:
void CGkbc8Dlg::OnBrowser() //浏览要复制到U盘文件夹
{
LPITEMIDLIST pidl; //><获取桌面路径
LPMALLOC pShellMalloc;
char szDir[MAX_PATH];
if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))
{
if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pidl)))
{
SHGetPathFromIDList(pidl, szDir);
pShellMalloc->Free(pidl);
}
pShellMalloc->Release();
}
复制代码
//><选择路径
BROWSEINFO bi;
bi.hwndOwner = this->GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = NULL;
bi.lpszTitle = TEXT("请选择文件夹");
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
bi.lpfn = NULL; // //回调函数
bi.lParam = (LPARAM)szDir;//= 0;//传给回调函数的参数,设置默认路径
bi.iImage = 0;
pidl = SHBrowseForFolder(&bi);
if (pidl == NULL)
return;
if (SHGetPathFromIDList(pidl, szDir))
{
CString sDir(szDir);
SetDlgItemText(IDC_EDIT1,sDir);
}
}
打开U盘按钮函数:
void CGkbc8Dlg::OnOpen() ///打开U盘
{
if(!IsValidDriver(m_sUDist))
return;
ShellExecute(NULL,"Open",m_sUDist,NULL,NULL,SW_SHOWNORMAL);//打开U盘
}
检测U盘插入函数OnDeviceChange:
void CGkbc8Dlg::OnDeviceChange( UINT nEventType, DWORD dwData )
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData; // struct transform
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch (nEventType)
{
case DBT_DEVNODES_CHANGED:
break;
复制代码
case DBT_DEVICEARRIVAL: //设备已插入,且可用
{
m_sUDist.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
}
break;
case DBT_DEVICEREMOVECOMPLETE: // 设备已完全安全拔出
{
m_sUDist.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
}
break;
}
}
例程中两个自定义函数:
#include <dbt.h>
char FirstDriveFromMask( ULONG unitmask )//根据MSDN手册对结构体DEV_BROADCAST_VOLUME的介绍编写此函数
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return( i + 'A' );
}
BOOL IsValidDriver(CString sDriver)
{
if(sDriver.IsEmpty()) return false;
BOOL bValid=false;
unsigned int type= GetDriveType(sDriver);//获取盘符类型
if(type == DRIVE_UNKNOWN)
bValid = FALSE;
else if(type == DRIVE_NO_ROOT_DIR)
bValid = FALSE;
else if(type == DRIVE_REMOVABLE)
bValid = TRUE;
else if(type == DRIVE_FIXED)
bValid = TRUE;
复制代码
else if(type == DRIVE_REMOTE)
bValid = TRUE;
else if(type == DRIVE_CDROM)
bValid = TRUE;
else if(type == DRIVE_RAMDISK)
bValid = TRUE;
else
bValid = FALSE;
return bValid;
}
复制代码
例程中变量m_sUDist为自定义变量private: CString m_sUDist;用于插入电脑的U盘的盘符记录
我们来演示整个功能实现过程
[iqiyi]http://dispatcher.video.qiyi.com/disp/shareplayer.swf?vid=536e319a645327db805f6986d30a5232&tvId=5379568409&cnId=23&coop=ugc_openapi_iqiyiyzm&cid=qc_100001_300089&bd=1&autoChainPlay=0&autoplay=1&showRecommend=0[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4