一、选择文件
其中CFileDialog类中的参数OFN_ALLOWMULTISELECT表示多个文件的选择,若只需要选择一个文件,删除该参数即可。
/// <summary>
/// 选择多个文件路劲
/// </summary>
/// <param name="FilesPath">输出文件路径</param>
/// <param name="FilesName">输出文件名</param>
/// <returns>返回文件个数</returns>
int SelectMultFilesPath(CString* FilesPath, CString* FilesName)
{
CFileDialog fileDlg(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, _T("all Files (*.*)|*.*||"), NULL);
CString inPath;
CArray<CString, CString> aryFilePath;
CArray<CString, CString> aryFileName;
if (fileDlg.DoModal() == IDOK) //弹出对话框
{
POSITION posFile = fileDlg.GetStartPosition();
CString filePath = _T("");
while (posFile != NULL)
{
filePath = fileDlg.GetNextPathName(posFile);
aryFilePath.Add(filePath);
aryFileName.Add(filePath.Right(filePath.GetLength() - filePath.ReverseFind('\\') - 1));
}
}
int SelFileNum = aryFilePath.GetSize();//获取选择的文件数
if (SelFileNum == 0)
{
return 0;
}
CString strMultFilesPath = _T("");
for (size_t i = 0; i < SelFileNum; i++)
{
*FilesPath += (aryFilePath[i] + _T(";"));
*FilesName += (aryFileName[i] + _T(";"));
}
return SelFileNum;
}
二、选择文件夹
/// <summary>
/// 选择文件夹
/// </summary>
/// <returns>返回文件夹路径</returns>
CString SelectFloderPath()
{
TCHAR szFolderPath[MAX_PATH] = { 0 };
CString strFolderPath = TEXT("");
BROWSEINFO sInfo;
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot = 0;
sInfo.lpszTitle = _T("请选择处理结果存储路径");
sInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN;
sInfo.lpfn = NULL;
// 显示文件夹选择对话框
LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
if (lpidlBrowse != NULL)
{
// 取得文件夹名
if (::SHGetPathFromIDList(lpidlBrowse, szFolderPath))
{
strFolderPath = szFolderPath;
}
}
if (lpidlBrowse != NULL)
{
::CoTaskMemFree(lpidlBrowse);
}
return strFolderPath;
}
三、拷贝文件
/// <summary>
/// 文件拷贝
/// </summary>
/// <param name="copyFilePath">拷贝文件路径</param>
/// <param name="pasteFilePath">粘贴文件路径</param>
void CopyFile(CString copyFilePath,CString pasteFilePath)
{
BOOL rec = PathFileExists(pasteFilePath);
if (rec)
{
UINT flag = MessageBox(0, _T("确认要覆盖已存在文件" + pasteFilePath + "吗?"), TEXT("温馨提示"), MB_YESNO | MB_ICONQUESTION);
if (flag == IDNO)
return;
else
{
if (!DeleteFile(pasteFilePath))
{
CString strTempPath;
strTempPath.Format(L"删除%s失败,请手动清除。", pasteFilePath);
AfxMessageBox(strTempPath);
}
}
}
BOOL m = CopyFile(copyFilePath, pasteFilePath, TRUE);
if (!m)
MessageBox(0,_T("文件已经存在,导入失败!"), TEXT("错误提醒"),MB_OK | MB_ICONERROR);//这里是添加消息提示
}
四、拷贝文件夹
/// <summary>
/// 文件夹删除
/// </summary>
/// <param name="strDir">删除文件夹路径</param>
static void DeleteFloder(const CString& strDir)
{
if (strDir.IsEmpty())
{
RemoveDirectory(strDir);
return;
}
//首先删除文件及子文件夹
CFileFind ff;
BOOL bFound = ff.FindFile(strDir + _T("\\*"), 0);
while (bFound)
{
bFound = ff.FindNextFile();
if (ff.GetFileName() == _T(".") || ff.GetFileName() == _T(".."))
continue;
//去掉文件(夹)只读等属性
SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL);
if (ff.IsDirectory())
{
//递归删除子文件夹
DeleteFloder(ff.GetFilePath());
if (!RemoveDirectory(ff.GetFilePath()))
{
CString strTempPath;
strTempPath.Format(L"删除%s失败,请手动清除。", ff.GetFilePath());
AfxMessageBox(strTempPath);
}
}
else
{
if (!DeleteFile(ff.GetFilePath()))
{
CString strTempPath;
strTempPath.Format(L"删除%s失败,请手动清除。", ff.GetFilePath());
AfxMessageBox(strTempPath);
}
}
}
ff.Close();
}
/// <summary>
/// 文件夹拷贝
/// </summary>
/// <param name="copyFloder">拷贝文件夹路径</param>
/// <param name="pasteFloder">粘贴文件夹路径</param>
void CopyFloder(CString copyFloder, CString pasteFloder)
{
BOOL rec = PathFileExists(pasteFloder);
if (rec)
{
UINT flag = MessageBox(0, _T("确认要覆盖已存在文件夹" + pasteFloder + "吗?"), TEXT("温馨提示"), MB_YESNO | MB_ICONQUESTION);
if (flag == IDNO)
return;
else
{
DeleteFloder(pasteFloder);
}
}
CreateDirectory(pasteFloder, NULL); //获取目标拷贝的路径 拷贝至哪里
CFileFind finder;
CString path = copyFloder + _T("\\*.*"); //需要拷贝的文件的路径
// AfxMessageBox(path); //调试用
bool bWorking = finder.FindFile(path); //是否找到了需要拷贝的文件的路径
while (bWorking) {
bWorking = finder.FindNextFile();
//AfxMessageBox(finder.GetFileName()); //调试用
if (finder.IsDirectory() && !finder.IsDots()) { //是不是有效的文件夹
CopyFloder(finder.GetFilePath(), pasteFloder + _T("\\") + finder.GetFileName()); //递归查找文件夹
}
else { //是文件则直接复制
CopyFile(finder.GetFilePath(), pasteFloder + _T("\\") + finder.GetFileName(), TRUE); //拷贝文件夹下的所有文件
}
}
}