16,473
社区成员
发帖
与我相关
我的任务
分享
请回答的详细点
BOOL WINAPI CopyFileEx(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_opt_ LPPROGRESS_ROUTINE lpProgressRoutine, //这个参数就是回调函数
_In_opt_ LPVOID lpData,
_In_opt_ LPBOOL pbCancel,
_In_ DWORD dwCopyFlags
);
其回调函数类型可以参考
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363854(v=vs.85).aspx
关键操作就在这个回调函数里面进行。
举个例子就清楚了:
DWORD CALLBACK progressRoutine(
LARGE_INTEGER TotalFileSize, //总字节数
LARGE_INTEGER TotalBytesTransferred, //已经复制的字节数
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData
)
{
SYSTEMTIME end;
GetLocalTime(&end);
LONGLONG msecs = subtract(&end, (SYSTEMTIME*) lpData); //当前耗时
cout << TotalBytesTransferred.QuadPart << "/" << TotalFileSize.QuadPart
<< " bytes copied in " << " " << msecs << " ms ...." << endl; //输出复制进度
return PROGRESS_CONTINUE;
}
至于将复制进度显示到进度条,是另一个独立的问题。
通过上述方法已经得到复制进度,可以这个作为已知,然后查阅如何与进度条联系起来的资料。