最简单的复制单个文件并显示进度条(copyfileex 及它的回调函数)

  1. 进度条

给对话框放入一个按钮一个进度条,给进度条添加变量m_progress1,然后在cpp里加入下面3段代码

/**************************************************************************************************/
DWORD CALLBACK lpProgressRoutine(
	LARGE_INTEGER TotalFileSize,
	LARGE_INTEGER TotalBytesTransferred,
	LARGE_INTEGER StreamSize,
	LARGE_INTEGER StreamBytesTransferred,
	DWORD dwStreamNumber,
	DWORD dwCallbackReason,
	HANDLE hSourceFile,
	HANDLE hDestinationFile,
	LPVOID lpData
	)
{
	CCOPYSINGLEFILEDlg *cl_this = (CCOPYSINGLEFILEDlg *)lpData;
	if (dwCallbackReason == CALLBACK_STREAM_SWITCH) // 这里第一次调用时才为TRUE, 之后都是FALSE.
	{
		cl_this->m_progress1.SetRange(0, TotalFileSize.LowPart);
	}
	cl_this->m_progress1.SetPos(TotalBytesTransferred.LowPart);
	return PROGRESS_CONTINUE;
}

/**************************************************************************************************/
DWORD CALLBACK ThreadProc(LPVOID lpParameter)
{
	CCOPYSINGLEFILEDlg * cl_this = (CCOPYSINGLEFILEDlg *)lpParameter;
	CString str1, str2;
	str1 = _T("");//要复制的文件的路径和文件名
	str2 = _T("");//目标路径和文件名
	if (!CopyFileEx(str1, str2, (LPPROGRESS_ROUTINE)lpProgressRoutine,
		cl_this, FALSE, COPY_FILE_RESTARTABLE))//最后一个参数,文件存在则覆盖
	{
	}
	return 0;
}

/**************************************************************************************************/
void CCOPYSINGLEFILEDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	
	HANDLE thread = CreateThread(NULL, 0, ThreadProc, this, NULL, NULL);
	CloseHandle(thread);
}
/**************************************************************************************************/
  1. 选择文件目标路径
BROWSEINFO bi = { 0 };	//浏览文件夹对话框结构体
	TCHAR pszDisplayName[MAX_PATH] = { 0 };
	bi.hwndOwner = NULL;
	bi.pszDisplayName = pszDisplayName;	//存储路径名
	bi.lpszTitle = TEXT("请选择目录:");	//对话框标题
	bi.ulFlags = BIF_USENEWUI;	//列出文件和文件夹并在编辑框中显示名称
	LPITEMIDLIST lpIL = SHBrowseForFolder(&bi);	//显示一个使用户可以选择的文件打开对话框
	if (lpIL)
	{
		SHGetPathFromIDList(lpIL, bi.pszDisplayName);	//把一个item identifier list转化为一个文件系统路径
	}
	m_edit1 = pszDisplayName;//pszDisplayName就是路径,显示到edit
	UpdateData(FALSE);

你可能感兴趣的:(文件操作)