174上位机VC MFC迭代复制文件夹及内部文件
174上位机VC MFC迭代复制文件夹及内部文件
功能展示
将指定的文件夹包括其内部的文件及子文件夹复制到其他目录可以用迭代的方法实现也可以SHFileOperation()函数实现,当前例程实现两种方法复制文件夹的功能,效果如图; 要点提示 SHFileOperation()函数控制文件夹时,可以通过设置它参数的具体值来完成,函数原型为int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp ); 指定lpFileOp .wFunc=FO_COPY或FO_MOVE或FO_DELETE或FO_RENAME;分别表示复制移动删除重命名文件;具体用法参考例程源码;
另一种方法是通过CFileFind类的成员函数遍历要复制的文件夹内容,再通过CopyFile(), CopyFolder()迭代复制文件和文件夹到指定目录;
实现功能 1.新建基于对话框的应用程序 2.拖拽一静态文本控件ID 为IDC_NOTE,用于显示操作结果; 拖拽两编辑框ID为IDC_EDIT1,IDC_EDIT2用于显示源文件夹及目标夹路径; 拖拽两按钮实现源文件夹及目标夹路径的选择;
两拖拽两按钮实现两种不同方法的复制; - void CGkbc8Dlg::OnBrowser1()
- {
- //><获取桌面路径
- 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 = BrowseCallBackFun;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_EDIT2,sDir);
- }
- }
- void CGkbc8Dlg::OnSinglecopy()
- {
- CString sDir,sNewDir;
- GetDlgItemText(IDC_EDIT1,sDir);
- GetDlgItemText(IDC_EDIT2,sNewDir);
- char SourceFolder[MAX_PATH+1]="";
- strcpy(SourceFolder,sDir);
- char TargetFolder[MAX_PATH+1]="";
- strcpy(TargetFolder,sNewDir);
- //
- SHFILEOPSTRUCT lpFile;
- lpFile.hwnd=GetSafeHwnd();
- lpFile.wFunc=FO_COPY;
- lpFile.pFrom=SourceFolder;
- lpFile.pTo=TargetFolder;
- lpFile.fFlags=FOF_ALLOWUNDO;
- lpFile.fAnyOperationsAborted=FALSE;
- lpFile.hNameMappings=NULL;
- lpFile.lpszProgressTitle=NULL;
- int ReturnValue=SHFileOperation(&lpFile);
- if(ReturnValue==0)
- {
- if(lpFile.fAnyOperationsAborted==TRUE)
- SetDlgItemText(IDC_NOTE,"复制文件夹取消");
复制代码- else
- SetDlgItemText(IDC_NOTE,"复制文件夹成功");
- }
- else
- SetDlgItemText(IDC_NOTE,"复制文件夹失败");
- }
- void CGkbc8Dlg::OnMulticopy()
- {
- CString sFromDir,sToDir;
- GetDlgItemText(IDC_EDIT1,sFromDir);
- GetDlgItemText(IDC_EDIT2,sToDir);
- if(sFromDir.IsEmpty()||sToDir.IsEmpty())
- return;
- sToDir+=sFromDir.Right(sFromDir.GetLength()-sFromDir.ReverseFind('\\')-1);
- if(!CopyFolder(sFromDir,sToDir))
- SetDlgItemText(IDC_NOTE,"复制文件夹失败");
- else SetDlgItemText(IDC_NOTE,"复制文件夹成功");
- }
复制代码我们来演示下功能实现的整个过程
|