Как правильно использовать функции CopyFileEx и CopyProgressRoutine? - PullRequest
1 голос
/ 26 февраля 2010

Я сделал приложение, которое копирует файлы, обычно большие файлы. Я хочу показать прогресс копирования, но не могу заставить его работать. Может кто-нибудь сказать мне, что я делаю не так? Сейчас это работает очень интересно. % Увеличивается до 49%, затем возвращается к 0, затем к 40, затем снова к 0, а затем к 35, и так далее до тех пор, пока файл не будет успешно скопирован, но я не понимаю, почему я получаю такой странное восприятие. Это может быть потому, что я вычисляю переменную процента, как я делаю это позже? Если я хочу рассчитать проценты следующим образом: процент = TotalBytesTransferred * 100 / TotalFileSize; тогда я получаю ошибку компилятора: «ошибка C2676: двоичный файл * *:« LARGE_INTEGER »не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора», и именно поэтому я рассчитываю именно так *

Заранее спасибо!

Kampi

Код:

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

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Я использую:

int percent = floor ((100.0 * (float)TotalBytesTransferred.QuadPart / (float)TotalFileSize.QuadPart));
0 голосов
/ 17 марта 2016
__int64 percent = (TotalBytesTransferred.HighPart * 2147483648 + TotalBytesTransferred.LowPart) * 100 / (TotalFileSize.HighPart * 2147483648 + TotalFileSize.LowPart);

у вас логическая ошибка! TotalBytesTransferred изменить на TotalFileSize

...