Рубрики
Tech

Прогресс копирования файла (CopyFileEx и ProgressBar)

При копировании объемных файлов функцией CopyFileEx() [1] возможно сообщать пользователю о прогрессе выполнения операции, при помощи callback-функции (обратного вызова). Например, посредством прогрессбара (полоски загрузки).

Помимо вызова функции CopyFileEx() необходимо написать реализацию колбэк-функции. Допустим, что на форме Form1 у нас есть компонент ProgressBar1, в котором мы и планируем отображать прогресс копирования, тогда реализация выглядит следующим образом:

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
)
{
    // изменяем тукущую позицию
    Form1->ProgressBar1->Position =
        Form1->ProgressBar1->Max * TotalBytesTransferred.QuadPart 
            / TotalFileSize.QuadPart;
    return PROGRESS_CONTINUE;
}

Теперь при вызове функции CopyFileEx() нам достаточно лишь передать ей имя колбэк-функции.

// здесь храним пути к исходному файлу и месту назначения копирования
const char *FileFrom = ("c:\somewhere\file.txt").c_str();
const char *FileTo   = ("\server\pub\pepyaka.ololo").c_str();

// включаем обработку сообщений для того, чтобы видеть изменения прогрессбара
Application->ProcessMessages();

// копируем с флагом защиты от перезаписи
bool copied = CopyFileEx(FileFrom, FileTo, ProgressRoutine,
    NULL, 0, COPY_FILE_FAIL_IF_EXISTS);

// по значению переменной copied можно судить об успехе операции
if (copied == true) ShowMessage("Всё отменно скопировалось");

При возникновении ошибок поможет функция GetLastError() [2], которая вернет код подседней ошибки WINAPI. Значение кода поможет понять этот список.

Добавить комментарий