본문 바로가기
C & C++/C & C++

파일 복사시 진행률 받아오기

by izen8 2011. 3. 29.
반응형
CopyFileEx()를 통하여 복사 진행상황을 받아올 수 있어야 합니다.
그래야 ProgressBar에 진행률을 표시할 수 있을테니까요~

그리고,
CopyFileEx()를 통하더라도 진행률을 나타내는 다이얼로그가 Invalidate가 제대로 이루어지지 않습니다. 복사 동안은 윈도우메시지를 받지 못하기 때문이겠죠.

그래서 이를 쓰레드로 다시 싸는 작업을 해야합니다.

대충 다음과 같은 코드들이 쓰이게 됩니다.

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)
{
    CCopyFileProgressDlg* pDlg = (CCopyFileProgressDlg*)lpData;
    if (!pDlg || pDlg->m_bStop)
        return PROGRESS_STOP;

    pDlg->UpdateProgressbar(PROGRESSVALUE(TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart));
    if (PROGRESSVALUE(TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart) < 100)
        return PROGRESS_CONTINUE;

    return PROGRESS_STOP;
}

 

DWORD WINAPI CopyFileThread(LPVOID lParam)
{
    CCopyFileProgressDlg* pDlg = (CCopyFileProgressDlg*)lParam;
    if (!pDlg)
        return 0;

    BOOL bCancel = FALSE;
    ::CopyFileEx(pDlg->m_strSrcPath, pDlg->m_strDestPath, &CopyProgressRoutine, pDlg, &bCancel, /*COPY_FILE_FAIL_IF_EXISTS*/0);

    if (pDlg->m_bStop)
        return 0;

    if (pDlg && pDlg->GetSafeHwnd())
        pDlg->PostMessage(WM_CLOSE);

    return 0;
}

 

 

DWORD dwThreadId;
m_hThread = CreateThread(NULL,                // pointer to security attributes
                            0,              // initial thread stack size
                            CopyFileThread,    // pointer to thread function
                            this,            // argument for new thread
                            0,              // creation flags
                            &dwThreadId        // pointer to receive thread ID
                            );

반응형

댓글