MFC应用实例:[61]复制文件夹及其文件
1、新建一个基于对话框的应用程序,工程名为CopyFolder。
![MFC应用实例:[61]复制文件夹及其文件](https://exp-picture.cdn.bcebos.com/3761a73acd8920c5066b6486568a59de440788fb.jpg)
3、对源目录后面的“>>”按钮添加响应函数OnRfolder(),响应函数OnRfolder()代码如下:void C潮贾篡绐CopyFolderDlg::OnRfolder(){ LPMALLOC pMalloc; //定义指向IMalloc的指针 if (::SHGetMalloc(&pMalloc) != NOERROR) return; // failed to get allocator char szDisplayName[_MAX_PATH]; char szBuffer[_MAX_PATH]; BROWSEINFO browseInfo; //构造对话框结构 browseInfo.hwndOwner = this->m_hWnd; browseInfo.pidlRoot = NULL; //设置根目录为桌面 browseInfo.pszDisplayName = szDisplayName; browseInfo.lpszTitle = "选择要复制的源目录"; //对话框标题 browseInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS; browseInfo.lpfn = NULL; //未用 browseInfo.lParam = 0; //未用 LPITEMIDLIST lpItemIDList; if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo))!= NULL) { if (::SHGetPathFromIDList(lpItemIDList, szBuffer))//得到目录的路径 { if (szBuffer[0] == '\0') { return ; } m_strSourceFolder = szBuffer; UpdateData(false); } else { AfxMessageBox("不能得到所选的文件夹!",MB_ICONSTOP|MB_OK); return; } pMalloc->Free(lpItemIDList); pMalloc->Release(); }}
![MFC应用实例:[61]复制文件夹及其文件](https://exp-picture.cdn.bcebos.com/95bd4e8c9bcec7f8a513b16e034ce54a2e27fbfb.jpg)
5、对“复制”按钮添加响应函数OnCopy(),响应函数OnCopy()代码如下:void CCopyFolderDlg::OnCopy(){ UpdateData(true); SHFILEOPSTRUCT sfo;//结构体 char szSource[MAX_PATH]; char szDest[MAX_PATH]; lstrcpy(szSource,m_strSourceFolder);//源目录 lstrcpy(szDest,m_strDestFolder);//目的目录 szSource[lstrlen(szSource)+1] = 0; szDest[lstrlen(szDest)+1] = 0; sfo.hwnd = NULL;//窗口指针 sfo.wFunc = FO_COPY;//操作类型为复制 sfo.pFrom = (LPCSTR)szSource;//源目录 sfo.pTo = (LPCSTR)szDest;//目的目录 sfo.fFlags = FOF_NOCONFIRMATION | //对所有复制过程中可能弹出的对话框采用“全是”选项 FOF_SIMPLEPROGRESS | //使用进度条 FOF_NOCONFIRMMKDIR ; //不自动创建新目录 sfo.hNameMappings = 0; sfo.lpszProgressTitle = "文件夹拷贝";//进度条的标题 if(SHFileOperation(&sfo)==0) //拷贝成功,SHFileOperation返回0 AfxMessageBox("成功完成拷贝!"); else AfxMessageBox("拷贝出错");}
![MFC应用实例:[61]复制文件夹及其文件](https://exp-picture.cdn.bcebos.com/6a408cdd3340b6f3abe3efaf12c0affce086eefb.jpg)