功能函数程序记录

将文件路径中的"\" 转为"\\"
CString str;
str.Replace(L"\\", L"\\\\");
将文件夹目录中的所有文件(包括子文件)复制到另一个指定文件夹(不包含子文件夹)中。

递归版本:

//csSourceFolder  源文件夹(包含子文件夹)
//csNewFolder  目标文件夹(不包含子文件夹)
void CCopyFolderAllFiles(CString csSourceFolder, CString csNewFolder)
{
	CFileFind f;
	BOOL bFind = f.FindFile(csSourceFolder + "\\*.*");
	while (bFind)
	{
		bFind = f.FindNextFile();
		TRACE(_T("%s\r\n"), f.GetFileName());
		if (f.IsDots()) continue;//..or .当前目录或者上一级目录
		if (f.IsDirectory())//判断是否是一个目录(文件夹)
		{
			//_mkdir(csNewFolder + "\\" + f.GetFileName());//创建文件夹
			CopyFolderAllFiles(csSourceFolder + "\\" + f.GetFileName(), csNewFolder);
		}
		//FILE_ATTRIBUTE_READONLY   //设为只读
        //FILE_ATTRIBUTE_HIDDEN    //设为隐藏
		::SetFileAttributes(csSourceFolder + "\\" + f.GetFileName(), FILE_ATTRIBUTE_NORMAL);//设为正常,取消所有属性设定
		::AfxGetApp()->DoWaitCursor(1);//打开沙漏光标
		::CopyFile(csSourceFolder + "\\" + f.GetFileName(), csNewFolder + "\\" + f.GetFileName(), TRUE); // 如果目标已经存在,不拷贝(TRUE)并返回False,覆盖目标(FALSE)
		::AfxGetApp()->DoWaitCursor(-1); //关闭沙漏光标
	}
}
复制文件夹(包括子文件夹)中所有文件到另外一个文件夹(包含子文件夹)
//csSourceFolder  源文件夹(包含子文件夹)
//csNewFolder  目标文件夹(不包含子文件夹)
//csSourceFolder = "D:\\test"
//csNewFolder = "E:\\文件\\TestCopeFile\\路径\\f"
void CopyFolderAllFilesWithFolder(CString csSourceFolder, CString csNewFolder)
{
	CFileFind f;
	BOOL bFind = f.FindFile(csSourceFolder + "\\*.*");
	std::string strFolder = CW2A(csNewFolder.GetString());;
	if (_access(strFolder.c_str(), 0) == -1)//如果目标文件夹不存在,则创建
		_mkdir(strFolder.c_str());
	while (bFind)
	{
		bFind = f.FindNextFile();
		//TRACE(_T("%s\r\n"), f.GetFileName());
		if (f.IsDots()) continue;
		if (f.IsDirectory())
		{
			CString cstrTemp = _T("");
			cstrTemp = csNewFolder + "\\" + f.GetFileName();
			std::string strFolder = CW2A(cstrTemp.GetString());
			_mkdir(strFolder.c_str());
			CCopyFileDlg::CopyFolderAllFilesWithFolder(csSourceFolder + "\\" + f.GetFileName(), csNewFolder + "\\" + f.GetFileName());
		}
		::SetFileAttributes(csSourceFolder + "\\" + f.GetFileName(), FILE_ATTRIBUTE_NORMAL);
		::AfxGetApp()->DoWaitCursor(1);
		::CopyFile(csSourceFolder + "\\" + f.GetFileName(), csNewFolder + "\\" + f.GetFileName(), FALSE);
		::AfxGetApp()->DoWaitCursor(-1);
	}
}

CopyFile:拷贝文件
CopyFile函数的定义形式为:

BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists ); 

第一个参数: lpExistingFileName :源文件;
第二个参数: lpNewFileName :拷贝后得到的新文件;

第三个参数: bFailIfExists :为true时 一旦目标文件已经存在,则函数调用会失败。 false时 , 目标文件被改写 。

返回值:非零为成功,零为失败,失败会设置 GetLastError 。

支持各种格式的文件拷贝(doc,xls,dwg,txt。。。。。)

使用SHFileOperation()函数来拷贝文件夹,代码如下:

void CopyFileToDir()
{
	SHFILEOPSTRUCT fop;
	CString cstrFrom = _T("C:\\Program Files\\test");
	cstrFrom += '\0';//需要以\0结尾
	CString cstrTo = _T("E:\\文件\\TestCopeFile\\路径\\f");//c:\\b\0
	cstrTo += '\0';
	ZeroMemory(&fop, sizeof fop);
	fop.wFunc = FO_COPY;//选择执行类型,FO_COPY,FO_DELETE,FO_RENAME,FO_MOVE四种
	fop.pFrom = cstrFrom;
	fop.pTo = cstrTo;
	//fop.fFlags = FOF_SIMPLEPROGRESS;
	SHFileOperation(&fop);
}

从注册表中获取程序的安装路径RegOpenKeyEx()函数

void CCircleFindDlg::GetInstallPath()
{
	long lRet;
	HKEY hKey;
	TCHAR tchData[64];
	DWORD dwSize;
	lRet = RegOpenKeyEx(
		HKEY_LOCAL_MACHINE,
	L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
		0,
		KEY_QUERY_VALUE,
		&hKey
		);
	if (lRet == ERROR_SUCCESS)
	{
		dwSize = sizeof(tchData);
		lRet = RegQueryValueEx(
			hKey,
			L"InstallPath",
			NULL,
			NULL,
			(LPBYTE)tchData,
			&dwSize
			);
		if (lRet == ERROR_SUCCESS)
		{
			CString filePath = _T("");
			filePath.Format(L"%s", tchData);
			CStringA cstraFilePath(CT2A(filePath, CP_ACP));
			m_strFilePath = cstraFilePath.GetBuffer(0);
			cstraFilePath.ReleaseBuffer();
		}
	}
	RegCloseKey(hKey);
}

CString转std::string

CString csNewFolder=_T("");
std::string strNewFolder;
strNewFolder = CW2A(csNewFolder.GetString());

MFC中关闭窗口的几种方法:

退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE);

关闭当前窗口用DestroyWindow( );

关闭模式对话框用EndDialog(0);

VC/MFC强制退出本进程自己,VC/MFC关闭自己

//强行结束自己
void TerminateApp()
{
  HANDLE hself = GetCurrentProcess();   
  TerminateProcess(hself, 0); 
}

VC/MFC 不使用定时器在for循环中更新进度条(CProgressCtrl)

使用以下方法可实现依据for循环中任务完成情况来更新进度条,且在重复点击Button1按钮的情况下,进度条能够重复的更新。

void CMFCApplication3Dlg::OnBnClickedButton1()
{
	// TODO:  在此添加控件通知处理程序代码
	//m_progress 变量为与控件IDC_PROGRESS关联的成员变量
    m_progress.SetRange(0, 100);
	m_progress.SetPos(0);
	
	for (int i = 0; i<101; i++)
	{
		m_progress.SetPos(i);
		Sleep(10);
		MSG msg;
		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值