216上位机VC MFC移动硬盘U盘自动打开与复制文件夹
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盘的盘符记录 我们来演示整个功能实现过程
|