Как я могу вызвать отмену при копировании файла?(используя функцию копирования файла ex с функцией обратного вызова процедуры копирования) - PullRequest
0 голосов
/ 01 апреля 2019

Я создал одну кнопку отмены, чтобы остановить копирование файла.Что мне следует вызвать в Copy Progress Routine, чтобы отменить копирование файла.

DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize, 
LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, 
LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD 
dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID 
lpData)
{   
HWND hWndDlg = (HWND)lpData;
static HWND hwndIDC_PROGRESS1;
hwndIDC_PROGRESS1 = GetDlgItem(hWndDlg, IDC_PROGRESS_DATA_OF_RETRIEVING);

DOUBLE Percentage = ((DOUBLE)TotalBytesTransferred.QuadPart / 
    (DOUBLE)TotalFileSize.QuadPart) * 100;

switch (dwCallbackReason)
{
    case CALLBACK_CHUNK_FINISHED:
    break;

    case CALLBACK_STREAM_SWITCH:
    if (cancel_Copy_File!=false) // cancel_copy_file is still undefined
        {
            return PROGRESS_CANCEL;
        }
    break;
}
return PROGRESS_CONTINUE;

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Вы реагируете только на CALLBACK_STREAM_SWITCH, что в большинстве случаев вы получите только один раз. CopyFileEx копирует файл в чанки и после каждого чанка вызывает обратный вызов с reson == CALLBACK_CHUNK_FINISHED. На самом деле вам не нужно различать эти случаи и обрабатывать оба с одним и тем же кодом.

DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize, 
    LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, 
    LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD 
    dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID 
    lpData)
{   
    HWND hWndDlg = (HWND)lpData;
    static HWND hwndIDC_PROGRESS1;
    hwndIDC_PROGRESS1 = GetDlgItem(hWndDlg, IDC_PROGRESS_DATA_OF_RETRIEVING);

    DOUBLE Percentage = ((DOUBLE)TotalBytesTransferred.QuadPart / 
        (DOUBLE)TotalFileSize.QuadPart) * 100;

    /* If you copy on GUI thread, you need to pump messages with
       while ( PeekMessage( ... ) ) { ... }
    */

    return cancel_Copy_File ? PROGRESS_CANCEL : PROGRESS_CONTINUE;
}
2 голосов
/ 01 апреля 2019

Yoy необходимо вернуть PROGRESS_CANCEL из CopyProgressRoutine, как описано здесь: Функция обратного вызова LPPROGRESS_ROUTINE https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nc-winbase-lpprogress_routine

Возвращаемое значение:

PROGRESS_CANCEL Отмените операцию копирования и удалите файл назначения.

PROGRESS_CONTINUE Продолжить операцию копирования.

См. Полный список в статье MSDN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...