MFC初探 —— 文件与文件夹的选择与拷贝

一、选择文件

其中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);  //拷贝文件夹下的所有文件
		}
	}
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值