开发者

How to use correctly CopyFileEx and CopyProgressRoutine functions?

I made an application which copies files, usually large files. I want to show the progress of the copying, but i can't it bring to work. Can someone tell me what i am doing wrong? Now it works very interesting. The % goes to 49% than, back to 0, and then to 40, then again back to 0 and then back 35, and this goes on, untill it copied successfully the file, but i don't understand why get i such a weird percetage. This could be because i calculate the percent variable like i do it later? If i want to calculate percent this way : percent = TotalBytesTransferred*100/TotalFileSize; then i get a compiler error : "error C2676: binary '*' : 'LARGE_INTEGER' does not define this operator or a conversion to a type acceptable to the predefined operator" and this is the reason why i calculate is this way.

Thanks in advance!

kampi

Code:

UINT CopyThread( LPVOID pParam )
{
 ....
 ....
 ....
 ret = CopyFileExA( Address.from, Address.to, &MyCopyProgressRoutine, ptr, FALSE,FALSE);
 ....
 ....
}  

DWORD CALLBACK MyCopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // file size
LARGE_INTEGER TotalBytesTransferred, // bytes transferred
LARGE_INTEGER StreamSize, // bytes in stream
LARGE_INTEGER StreamBytesTransferred, // bytes transferred for stream
DWORD dwStreamNumber, // current stream
DWORD dwCallbackReason, // callback reason
HANDLE hSourceFile, // handle to source file
HANDLE hDestinationFile, // handle to destination file
LPVOID lpData // from CopyFileEx
)
{
 TCHAR currentprog[20];

 CGetFileListDlg* ptr = (CGetFileListDlg*)lpData;
 // do something with poin开发者_JAVA技巧ter, e.g. ptr->m_Progressbar.Pos blahblah 

 //ptr->m_fileprog.Clear();
//ptr->UpdateWindow();
 DWORD percent = (TotalBytesTransferred.HighPart*2^31 + TotalBytesTransferred.LowPart) * 100/(TotalFileSize.HighPart*2^31 + TotalBytesTransferred.LowPart);

wsprintf( currentprog, _T("%d %%"),percent );
ptr->m_fileprog.SetWindowText( currentprog );

return  PROGRESS_CONTINUE;
}


__int64 percent = (TotalBytesTransferred.HighPart * 2147483648 + TotalBytesTransferred.LowPart) * 100 / (TotalFileSize.HighPart * 2147483648 + TotalFileSize.LowPart);

you have logical mistake! TotalBytesTransferred change to TotalFileSize


I use:

int percent = floor ((100.0 * (float)TotalBytesTransferred.QuadPart / (float)TotalFileSize.QuadPart));


Percent calculation can be made using

uint64_t  percent= ((uint64_t)TotalBytesTransferred.HighPart<<32 + TotalBytesTransferred.LowPart) * 100/((uint64_t)TotalFileSize.HighPart<<32 + TotalFileSize.LowPart);

(Prevents hardcoding of a value for 2^32)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜