MFC应用实例:[61]复制文件夹及其文件
1、新建一个基于对话框的应用程序,工程名为CopyFolder。
![MFC应用实例:[61]复制文件夹及其文件](https://exp-picture.cdn.bcebos.com/3761a73acd8920c5066b6486568a59de440788fb.jpg)
2、界面设计如下,添加四个按钮,两个编辑框,两个文本控件。
![MFC应用实例:[61]复制文件夹及其文件](https://exp-picture.cdn.bcebos.com/589f5b0788013870f225d63f2d08a50f95fc83fb.jpg)
3、对源目录后面的“>>”按钮添加响应函数OnRfolder() ,响应函数OnRfolder() 代码如下:
void CCopyFolderDlg::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)
4、对目的目录后面的“>>”按钮添加响应函数OnDfolder() ,响应函数OnDfolder() 代码如下:
void CCopyFolderDlg::OnDfolder()
{
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_strDestFolder = szBuffer;
UpdateData(false);
}
else
{
AfxMessageBox("不能得到所选的文件夹!",MB_ICONSTOP|MB_OK);
return;
}
pMalloc->Free(lpItemIDList);
pMalloc->Release();
}
}
![MFC应用实例:[61]复制文件夹及其文件](https://exp-picture.cdn.bcebos.com/890dfb4a2f27e7ef1d6287b219dd3340b7f3f5fb.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)
6、程序运行如下:
![MFC应用实例:[61]复制文件夹及其文件](https://exp-picture.cdn.bcebos.com/9881b1fce186242fe81678ac35e434daf15ee8fb.jpg)