復(fù)制文件可以用 CopyFile API 函數(shù)。CopyFileEx 函數(shù)的好處是:它提供了回調(diào)函數(shù),程序員可以向用戶顯示復(fù)制的過(guò)程。
這里我不打算介紹回調(diào)函數(shù)的詳細(xì)參數(shù),這個(gè)可以看MSDN;我說(shuō)一些MSDN中沒(méi)有說(shuō)明的東西。
1、多久回調(diào)一次?答案是:每傳輸 64KB 數(shù)據(jù)回調(diào)一次;
2、回調(diào)原因第一次返回:CALLBACK_STREAM_SWITCH ,以后都返回:CALLBACK_CHUNK_FINISHED
第一次表示開(kāi)始復(fù)制,但還沒(méi)有復(fù)制。
3、回調(diào)函數(shù)返回 PROGRESS_CONTINUE,表示繼續(xù)復(fù)制文件;返回 PROGRESS_CANCEL,表示中斷復(fù)制,這個(gè)比較有用。
上邊都是理論,下面我們看一個(gè)例子,該例子為 VC++ 6.0 控制臺(tái)工程。建立一個(gè)控制臺(tái)工程,選擇一個(gè)空的工程,建立一個(gè) C++ 文件,把下面代碼復(fù)制進(jìn)去即可.
/**//*************************************************************/
//
// CopyFileEx 回調(diào)函數(shù)應(yīng)用
//
// 寶寶 zaodt_ms@hotmail.com
//
// 2007-11-21
//
/**//*************************************************************/
#define _WIN32_WINNT 0x0500 // 不加這個(gè)不同通過(guò)編譯
#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("用法:命令 源文件 目標(biāo)文件");
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;
}
運(yùn)行結(jié)果:
回調(diào)次數(shù):1 已傳輸:00000000:00000000 文件大小:00000000: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,從第二次開(kāi)始,每次傳輸為 0x10000,為 64KB 字節(jié)。
這里我不打算介紹回調(diào)函數(shù)的詳細(xì)參數(shù),這個(gè)可以看MSDN;我說(shuō)一些MSDN中沒(méi)有說(shuō)明的東西。
1、多久回調(diào)一次?答案是:每傳輸 64KB 數(shù)據(jù)回調(diào)一次;
2、回調(diào)原因第一次返回:CALLBACK_STREAM_SWITCH ,以后都返回:CALLBACK_CHUNK_FINISHED
第一次表示開(kāi)始復(fù)制,但還沒(méi)有復(fù)制。
3、回調(diào)函數(shù)返回 PROGRESS_CONTINUE,表示繼續(xù)復(fù)制文件;返回 PROGRESS_CANCEL,表示中斷復(fù)制,這個(gè)比較有用。
上邊都是理論,下面我們看一個(gè)例子,該例子為 VC++ 6.0 控制臺(tái)工程。建立一個(gè)控制臺(tái)工程,選擇一個(gè)空的工程,建立一個(gè) C++ 文件,把下面代碼復(fù)制進(jìn)去即可.
/**//*************************************************************/
//
// CopyFileEx 回調(diào)函數(shù)應(yīng)用
//
// 寶寶 zaodt_ms@hotmail.com
//
// 2007-11-21
//
/**//*************************************************************/
#define _WIN32_WINNT 0x0500 // 不加這個(gè)不同通過(guò)編譯
#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("用法:命令 源文件 目標(biāo)文件");
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;
}
運(yùn)行結(jié)果:
回調(diào)次數(shù):1 已傳輸:00000000:00000000 文件大小:00000000: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,從第二次開(kāi)始,每次傳輸為 0x10000,為 64KB 字節(jié)。