将文件路径中的"\" 转为"\\"
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);
}
}
}