CopyFileEx函數(shù)的使用方法

字號:

復(fù)制文件可以用 CopyFile API 函數(shù)。CopyFileEx 函數(shù)的好處是:它提供了回調(diào)函數(shù),程序員可以向用戶顯示復(fù)制的過程。
    這里我不打算介紹回調(diào)函數(shù)的詳細參數(shù),這個可以看MSDN;我說一些MSDN中沒有說明的東西。
    1、多久回調(diào)一次?答案是:每傳輸 64KB 數(shù)據(jù)回調(diào)一次;
    2、回調(diào)原因第一次返回:CALLBACK_STREAM_SWITCH ,以后都返回:CALLBACK_CHUNK_FINISHED
    第一次表示開始復(fù)制,但還沒有復(fù)制。
    3、回調(diào)函數(shù)返回 PROGRESS_CONTINUE,表示繼續(xù)復(fù)制文件;返回 PROGRESS_CANCEL,表示中斷復(fù)制,這個比較有用。
    上邊都是理論,下面我們看一個例子,該例子為 VC++ 6.0 控制臺工程。建立一個控制臺工程,選擇一個空的工程,建立一個 C++ 文件,把下面代碼復(fù)制進去即可.
    /**//*************************************************************/
    //
    // CopyFileEx 回調(diào)函數(shù)應(yīng)用
    //
    // 寶寶 zaodt_ms@hotmail.com
    //
    // 2007-11-21
    //
    /**//*************************************************************/
    #define _WIN32_WINNT 0x0500 // 不加這個不同通過編譯
    #include
    #include
    DWORD CALLBACK CopyProgress(
     LARGE_INTEGER TotalFileSize, // total file size, in bytes
     LARGE_INTEGER TotalBytesTransferred, // total number of bytes transferred
     LARGE_INTEGER StreamSize, // total number of bytes for this stream
     LARGE_INTEGER StreamBytesTransferred, // total number of bytes transferred for this stream
     DWORD dwStreamNumber, // the current stream
     DWORD dwCallbackReason, // reason for callback
     HANDLE hSourceFile, // handle to the source file
     HANDLE hDestinationFile, // handle to the destination file
     LPVOID lpData // passed by CopyFileEx
    )
    ...{
     static int nRecord = 0;
     nRecord++;
     printf("回調(diào)次數(shù):%d 已傳輸:X:X 文件大小:X:X ",
     nRecord,
     TotalBytesTransferred.HighPart,
     TotalBytesTransferred.LowPart,
     TotalFileSize.HighPart,
     TotalFileSize.LowPart);
     return PROGRESS_CONTINUE;
    }
    int main(int argc, char* argv[])
    ...{
     if(argc!=3)
     ...{
     printf("用法:命令 源文件 目標文件");
     return 0;
     }
     if(!CopyFileEx(argv[1],argv[2],(LPPROGRESS_ROUTINE)CopyProgress,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS))
     ...{
     printf("CopyFileEx() failed.");
     return 0;
     }
     return 0;
    }
    運行結(jié)果:
    回調(diào)次數(shù):1 已傳輸:00000000:00000000 文件大?。?0000000:00F60964
    回調(diào)次數(shù):2 已傳輸:00000000:00010000 文件大?。?0000000:00F60964
    回調(diào)次數(shù):3 已傳輸:00000000:00020000 文件大?。?0000000:00F60964
    回調(diào)次數(shù):4 已傳輸:00000000:00030000 文件大?。?0000000:00F60964
    回調(diào)次數(shù):5 已傳輸:00000000:00040000 文件大?。?0000000:00F60964
    回調(diào)次數(shù):6 已傳輸:00000000:00050000 文件大小:00000000:00F60964
    回調(diào)次數(shù):7 已傳輸:00000000:00060000 文件大?。?0000000:00F60964
    分析:
    大家看第一次,已傳輸為0,從第二次開始,每次傳輸為 0x10000,為 64KB 字節(jié)。