急:实现较大文件移动读取进度条显示!!

郑沐洋 2014-03-03 10:52:31
我在做一个E盘资源管理器,由其他盘符移动进来的文件会有文件内容的读写操作,现在在移动大的文件的过程中,是毫无外观提示的,我想要将大文件分割,然后通过进度条显示,请大神指点一下,具体该如何写,不胜感激!!!!
...全文
363 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
郑沐洋 2014-03-07
  • 打赏
  • 举报
回复
引用 3 楼 zhouxiaofeng1021 的回复:
启动工作线程
void CDeleteFileDlg::OnBnClickedButtonDelete()
{
	// TODO: 在此添加控件通知处理程序代码
	if (m_strFilePath.IsEmpty())
	{ 
		AfxMessageBox(_T("The Param of File Path is Empty, Please Choose the Path\n") );		
		return ;
	}
     m_strFileName = m_strFilePath;
	 UpdateData(FALSE);
	 m_progressCtrl.ShowWindow(SW_SHOW);
	 m_progressCtrl.SetPos(m_ipos); 
	 // 启动定时监控器
	 SetTimer(ID_TIMER_PROCESSSHOW, 100, NULL);

	//更新过程中,将按钮设置成灰色
	GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(FALSE);
	// 开启线程
	CWinThread* pThread= AfxBeginThread(ThreadFun,this);			
	
	
}
这里处理进度
static UINT  ThreadFun(LPVOID pParam)
/*DWORD WINAPI (LPVOID pthread)*/
{	
	CDeleteFileDlg* pCDeleteFileDlg = (CDeleteFileDlg*)pParam;	
	if (!DeleteFileofDirectory(pCDeleteFileDlg->m_strFilePath))
	{	
		
		::PostMessage(pCDeleteFileDlg->m_hWnd,WM_DLG_DELETE_SHOW,0L,0L);
		AfxMessageBox(_T("Delete File Faill!!!\n"));

		return FALSE;
	} 
	
	::PostMessage(pCDeleteFileDlg->m_hWnd,WM_DLG_DELETE_SHOW,0L,0L);	
	AfxMessageBox( _T(" Delete File succeed!!!\n") );
	return TRUE;
}
这个是我写的 删除批量文件的代码中一部分呢
回答的很好,谢谢帮忙!
yifuzhiming 2014-03-06
  • 打赏
  • 举报
回复
得用多线程,楼上的思路很清楚了,还让人写代码,谁有那功夫
thinp 2014-03-04
  • 打赏
  • 举报
回复
也没多少代码,自己写当练手吧,本来文件操作就应该在另外一线程中实现,要不然界面就堵死了
yeah2000 2014-03-04
  • 打赏
  • 举报
回复
使用文件映像来读写
郑沐洋 2014-03-04
  • 打赏
  • 举报
回复
引用 4 楼 thinp 的回复:
得到总大小,在另外一线程中进行拷贝操作,计算出进度条长度,可以以像素为单为,总大小/总长度,算出最小变化步长,拷最小步长长度改变一下进度条进度
这个思路和我基本一样,请问你做过类似的东西么?求代码!
thinp 2014-03-03
  • 打赏
  • 举报
回复
得到总大小,在另外一线程中进行拷贝操作,计算出进度条长度,可以以像素为单为,总大小/总长度,算出最小变化步长,拷最小步长长度改变一下进度条进度
zhouxiaofeng1021 2014-03-03
  • 打赏
  • 举报
回复
启动工作线程
void CDeleteFileDlg::OnBnClickedButtonDelete()
{
// TODO: 在此添加控件通知处理程序代码
if (m_strFilePath.IsEmpty())
{
AfxMessageBox(_T("The Param of File Path is Empty, Please Choose the Path\n") );
return ;
}
m_strFileName = m_strFilePath;
UpdateData(FALSE);
m_progressCtrl.ShowWindow(SW_SHOW);
m_progressCtrl.SetPos(m_ipos);
// 启动定时监控器
SetTimer(ID_TIMER_PROCESSSHOW, 100, NULL);

//更新过程中,将按钮设置成灰色
GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(FALSE);
// 开启线程
CWinThread* pThread= AfxBeginThread(ThreadFun,this);


}


这里处理进度
static UINT  ThreadFun(LPVOID pParam)
/*DWORD WINAPI (LPVOID pthread)*/
{
CDeleteFileDlg* pCDeleteFileDlg = (CDeleteFileDlg*)pParam;
if (!DeleteFileofDirectory(pCDeleteFileDlg->m_strFilePath))
{

::PostMessage(pCDeleteFileDlg->m_hWnd,WM_DLG_DELETE_SHOW,0L,0L);
AfxMessageBox(_T("Delete File Faill!!!\n"));

return FALSE;
}

::PostMessage(pCDeleteFileDlg->m_hWnd,WM_DLG_DELETE_SHOW,0L,0L);
AfxMessageBox( _T(" Delete File succeed!!!\n") );
return TRUE;
}

这个是我写的 删除批量文件的代码中一部分呢
zhouxiaofeng1021 2014-03-03
  • 打赏
  • 举报
回复
工作线程给界面线程发送消息 启动工作线程时,传入窗口句柄
zhouxiaofeng1021 2014-03-03
  • 打赏
  • 举报
回复
这个你要做两个线程, 自己启动一个线程(工作线程): 你自己启动一个线程,用于处理移动大文件 另外一个线程,也就是界面线程用来实现进度条显示 必须把界面线程和工作线程分开! 不然会卡死的假象! 希望能帮你! 这个显示精度你自己把握 希望能帮到你!
shen_wei 2014-03-03
  • 打赏
  • 举报
回复
SHFileOperation 文件操作API

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧