VC

在 VC++中,如果你要进行大量的文件复制操作,用户体验就显得挺重要的,尤其是大文件时。文件复制没有进度显示,让人觉得等得不耐烦吧。其实你完全可以自己加一个进度条,这样不仅让用户知道任务进展,还能让等待不那么难熬。

使用 Windows API 中的CopyFile函数,虽然它能帮你复制文件,但没法显示进度条。所以需要借助更底层的 API,比如ReadFileWriteFileSetFilePointer,通过这些函数追踪文件复制的进度。

在实现进度条的过程中,可以用GetFileSize来获取文件大小,确定进度条的范围。每次读写操作后,就更新进度条的位置。这部分可以放在后台线程执行,防止界面卡顿。

如果你用的是 MFC 应用,可以通过CProgressCtrl来实现进度条。如果是 WinAPI 程序,那就可以用CreateWindow创建一个进度条控件,类型设置为PBST_NORMAL

代码实现上其实挺,下面是一个例子:

#include 
#include 
class CMyDlg : public CDialog {
//... afx_msg void OnBnClickedCopy();
//... }

void CMyDlg::OnBnClickedCopy() { CProgressCtrl* pProgress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS_BAR); pProgress->SetRange32(0, GetFileSize(sourceFileHandle, NULL)); DWORD bytesRead, bytesWritten; char buffer[4096]; while (ReadFile(sourceFileHandle, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0) { WriteFile(destinationFileHandle, buffer, bytesRead, &bytesWritten, NULL); pProgress->SetPos(pProgress->GetPos() + bytesRead); } }

需要注意的是,实际应用中还得异常、文件中断等情况,源码中了更完善的错误与多线程实现。如果你想进一步提升用户体验,建议按照这个思路去做,确保操作稳定流畅。

rar 文件大小:15.43KB