一、获取目标文件属性
将五个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();
}