【问题标题】:How to use correctly CopyFileEx and CopyProgressRoutine functions?如何正确使用 CopyFileEx 和 CopyProgressRoutine 函数?
【发布时间】:2010-02-26 03:31:11
【问题描述】:

我制作了一个复制文件的应用程序,通常是大文件。我想显示复制的进度,但我无法将它带到工作中。有人可以告诉我我做错了什么吗? 现在它非常有趣。 % 到 49%,然后回到 0,然后到 40,然后再回到 0,然后再回到 35,这样一直持续,直到它成功复制文件,但我不明白为什么我会这样奇怪的百分比。这可能是因为我像以后那样计算百分比变量?如果我想以这种方式计算百分比:百分比 = TotalBytesTransferred*100/TotalFileSize;然后我得到一个编译器错误:“错误C2676:二进制'*':'LARGE_INTEGER'没有定义此运算符或转换为预定义运算符可接受的类型”,这就是我这样计算的原因。

提前致谢!

坎皮

代码:

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 pointer, 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;
}

【问题讨论】:

    标签: c windows mfc


    【解决方案1】:
    __int64 percent = (TotalBytesTransferred.HighPart * 2147483648 + TotalBytesTransferred.LowPart) * 100 / (TotalFileSize.HighPart * 2147483648 + TotalFileSize.LowPart);
    

    你有逻辑错误! TotalBytesTransferred 更改为 TotalFileSize

    【讨论】:

      【解决方案2】:

      我用:

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

      【讨论】:

        【解决方案3】:

        百分比计算可以使用

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

        (防止硬编码 2^32 的值)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-19
          • 1970-01-01
          • 2014-04-22
          • 2021-02-03
          • 2011-12-22
          • 2016-12-21
          • 2010-11-16
          • 1970-01-01
          相关资源
          最近更新 更多