QQ登录

只需一步,快速开始

216上位机VC MFC移动硬盘U盘自动打开与复制文件夹

[ 复制链接 ]

216上位机VC MFC移动硬盘U盘自动打开与复制文件夹

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盘复制文件功能
  1. BOOL CGkbc8Dlg::CopyFolder(CString sFromDir,CString sToDir,BOOL bCreateDir)
  2. {
  3.         if(bCreateDir)
  4.                 if(!::CreateDirectory(sToDir,NULL))
  5.                         return FALSE;
  6.         CString sTemp;//路径改为\*.*形式
  7.         if(sFromDir.Right(1)!="\")
  8.                 sTemp.Format("%s\\*.*",sFromDir);
  9.         else
  10.                 sTemp.Format("%s*.*",sFromDir);
  11.         BOOL bResult=TRUE;
  12.         CFileFind findfile;
  13.         BOOL bfind=findfile.FindFile(sTemp);
  14.         while(bfind)
  15.         {
  16.                 bfind=findfile.FindNextFile();
  17.                 if(findfile.IsDirectory()&&!findfile.IsDots())//是文件夹时迭代复制
  18.                 {
  19.                         if(sToDir.Right(1)!='\\')
  20.                                 sToDir+='\\';
  21.                         if(S_OK==CopyFolder(findfile.GetFilePath(),sToDir+findfile.GetFileName()) )
  22.                                  bResult=TRUE;
  23.                         else
  24.                                 bResult = FALSE;
  25.                 }
  26.                
复制代码
  1. else//是文件时复制
  2.                 {
  3.                         if(sToDir.Right(1)!='\\')
  4.                                 sToDir+='\\';
  5.                         if(::CopyFile(findfile.GetFilePath(),sToDir+findfile.GetFileName(),FALSE) )
  6.                                 bResult=TRUE;
  7.                         else
  8.                                 bResult = FALSE;
  9.                         //还可以用函数::MoveFile()移动文件
  10.                 }
  11.         }
  12.         return bResult;
  13. }
  14. 复制按钮函数:
  15. void CGkbc8Dlg::OnCopy()
  16. {
  17.         CString sFromDir;
  18.         CString sToDir(m_sUDist);
  19.         GetDlgItemText(IDC_EDIT1,sFromDir);
  20.         if(sFromDir.IsEmpty()||m_sUDist.IsEmpty())
  21.                 return;
  22.         sToDir += sFromDir.Right(sFromDir.GetLength()-sFromDir.ReverseFind('\\')-1);
  23.         if(CopyFolder(sFromDir,sToDir))
  24.                 MessageBox("复制文件夹成功");
  25. }浏览要复制到U盘文件夹按钮函数:
  26. void CGkbc8Dlg::OnBrowser() //浏览要复制到U盘文件夹
  27. {
  28.         LPITEMIDLIST pidl; //><获取桌面路径
  29.         LPMALLOC pShellMalloc;
  30.         char szDir[MAX_PATH];
  31.         if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))
  32.         {
  33.                 if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pidl)))
  34.                 {
  35.                         SHGetPathFromIDList(pidl, szDir);
  36.                         pShellMalloc->Free(pidl);
  37.                 }
  38.                 pShellMalloc->Release();
  39.         }
复制代码
  1. //><选择路径
  2.     BROWSEINFO bi;   
  3.     bi.hwndOwner      = this->GetSafeHwnd();  
  4.     bi.pidlRoot       = NULL;  
  5.     bi.pszDisplayName = NULL;   
  6.     bi.lpszTitle      = TEXT("请选择文件夹");   
  7.     bi.ulFlags        = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;  
  8.     bi.lpfn           = NULL;  // //回调函数
  9.     bi.lParam         = (LPARAM)szDir;//= 0;//传给回调函数的参数,设置默认路径
  10.     bi.iImage         = 0;   

  11.     pidl = SHBrowseForFolder(&bi);  
  12.     if (pidl == NULL)  
  13.         return;
  14.   
  15.     if (SHGetPathFromIDList(pidl, szDir))  
  16.         {
  17.                 CString sDir(szDir);
  18.                 SetDlgItemText(IDC_EDIT1,sDir);
  19.         }        
  20. }
  21. 打开U盘按钮函数:
  22. void CGkbc8Dlg::OnOpen() ///打开U盘
  23. {
  24.         if(!IsValidDriver(m_sUDist))
  25.                 return;
  26.         ShellExecute(NULL,"Open",m_sUDist,NULL,NULL,SW_SHOWNORMAL);//打开U盘
  27. }
  28. 检测U盘插入函数OnDeviceChange:
  29. void CGkbc8Dlg::OnDeviceChange( UINT nEventType, DWORD dwData )
  30. {
  31.         PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;     // struct transform
  32.         PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
  33.         switch (nEventType)
  34.         {
  35.         case DBT_DEVNODES_CHANGED:
  36.                 break;
  37.         
复制代码
  1. case DBT_DEVICEARRIVAL:  //设备已插入,且可用
  2.                 {
  3.                         m_sUDist.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
  4.                 }
  5.                 break;
  6.         case DBT_DEVICEREMOVECOMPLETE:  // 设备已完全安全拔出
  7.                 {
  8.                         m_sUDist.Format("%c:\",FirstDriveFromMask(lpdbv ->dbcv_unitmask) ); //搞成盘符格式
  9.                 }
  10.                 break;
  11.         }
  12. }
  13. 例程中两个自定义函数:
  14. #include <dbt.h>
  15. char FirstDriveFromMask( ULONG unitmask )//根据MSDN手册对结构体DEV_BROADCAST_VOLUME的介绍编写此函数
  16. {
  17.         char i;
  18.         for (i = 0; i < 26; ++i)
  19.         {
  20.                 if (unitmask & 0x1)
  21.                         break;
  22.                 unitmask = unitmask >> 1;
  23.         }
  24.         return( i + 'A' );
  25. }
  26. BOOL IsValidDriver(CString sDriver)
  27. {
  28.         if(sDriver.IsEmpty()) return false;

  29.         BOOL bValid=false;
  30.         unsigned int type= GetDriveType(sDriver);//获取盘符类型
  31.         if(type == DRIVE_UNKNOWN)
  32.                 bValid = FALSE;
  33.         else if(type == DRIVE_NO_ROOT_DIR)
  34.                 bValid = FALSE;
  35.         else if(type == DRIVE_REMOVABLE)
  36.                 bValid = TRUE;
  37.         else if(type == DRIVE_FIXED)
  38.                 bValid = TRUE;
  39.         
复制代码
  1. else if(type == DRIVE_REMOTE)
  2.                 bValid = TRUE;        
  3.         else if(type ==  DRIVE_CDROM)
  4.                 bValid = TRUE;
  5.         else if(type ==  DRIVE_RAMDISK)
  6.                 bValid = TRUE;
  7.         else
  8.                 bValid = FALSE;
  9.         return bValid;
  10. }
复制代码
例程中变量m_sUDist为自定义变量private: CString m_sUDist;用于插入电脑的U盘的盘符记录
我们来演示整个功能实现过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:216.上位机VC MFC移动硬盘U盘自动打开与复制文件夹.rar 
文件大小:155.53 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索