一系列MFC操作文件实例(中)

一、获取目标文件属性


将五个EDITCTL分别与五个CString变量绑定,即CString m_Path;CString m_StartTime;CString m_ModTime;CString m_LastTime;CString m_Size;

消息处理函数为:

void CGetStatusDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE, NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("All Files(*.TXT)|*.TXT||"),this);
	if (dlg.DoModal() == IDOK)
	{
		m_Path = dlg.GetPathName(); //获取文件路径

		CFile file;
		file.Open(m_Path, CFile::modeRead); //以读取的方式打开文件

		CFileStatus flStatus;
		file.GetStatus(flStatus);
		file.Close();

		m_StartTime = flStatus.m_ctime.Format(_T("%Y-%m-%d %H:%M:%S"));
		m_ModTime   = flStatus.m_mtime.Format(_T("%Y-%m-%d %H:%M:%S"));
		m_LastTime  = flStatus.m_atime.Format(_T("%Y-%m-%d %H:%M:%S"));
		m_Size.Format(_T("%dK"), flStatus.m_size/1024);

		UpdateData(TRUE);
	}

}

二、复制文件显示进度


将控件绑定变量分别为:CString m_oFile;CString m_nFile;CProgressCtrl m_Progress;

选择源文件与目标文件夹消息处理代码如下:

void CjinduDlg::OnBnClickedButslect()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY, _T("All Files(*.*)|*.*||"), this);
	if (dlg.DoModal() == IDOK)
	{
		m_oFile = dlg.GetPathName();  //获取文件路径
		m_FileExt = dlg.GetFileExt(); //获取文件扩展名
		UpdateData(FALSE);
	}
}


void CjinduDlg::OnBnClickedButnewpath()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(FALSE, NULL, NULL, OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY, _T("All Files(*.*)|*.*||"), this);
	CString strText = _T(".");
	strText += m_FileExt;

	if (dlg.DoModal() == IDOK)
	{
		m_nFile = dlg.GetPathName();
		if (m_nFile.Right(4) != strText)
		{
			m_nFile += strText;
		}
		UpdateData(FALSE);
	}
}


复制按钮的消息处理函数如下:

void CjinduDlg::OnBnClickedButcopy()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData();
	HGLOBAL hGlobal;

	CFile* writefile;  //声明文件指针
	CFile* readfile;

	long readlen, poslen, filelen;

	LPVOID pvData;

	if (m_oFile.IsEmpty()||m_nFile.IsEmpty())
	{
		MessageBox(_T("文件夹不能为空"), _T("提示"), MB_OK);
		return;
	}

	readfile = new CFile(m_oFile, CFile::modeRead); //打开源文件

	HANDLE hfile = ::CreateFile(m_nFile, GENERIC_WRITE|GENERIC_READ, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
	CloseHandle(hfile);
	writefile = new CFile(m_nFile, CFile::modeWrite);  //打开目标文件

	filelen = readfile->GetLength();                  //获取源文件大小

	ldiv_t r;
	r = ldiv(filelen, 100);                          //计算比率
	long pos = r.quot;                               //取整
	long ipos;
	ipos = pos;
	int i = 0;
	hGlobal = GlobalAlloc(GMEM_MOVEABLE, 512);       //分配内存
	pvData = GlobalLock(hGlobal);
	
	while (1)
	{
		ZeroMemory(pvData, 512);
		readlen = readfile->Read(pvData, 512);
		poslen = readfile->GetPosition();

		if (poslen > ipos)
		{
			ipos += pos;
			i++;
		}
		m_Progress.SetPos(i);        //设置进度条
		m_Progress.Invalidate();     //重绘进度条
		writefile->Write(pvData, readlen); //向目标文件写入数据
		if(poslen == filelen)
			break;
	}

	AfxMessageBox(_T("复制完成"));
	m_Progress.SetPos(0);
    GlobalUnlock(hGlobal);
	readfile->Close();
	writefile->Close();

}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值