#include <stdio.h>
#include <windows.h>
#include <ctime>
BOOL GetFileMapHandle(_In_ PWCHAR pFilePath, _Out_ HANDLE& hFileMap, _Out_ DWORD& dwFileSize)
{
HANDLE hFile = CreateFile(pFilePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("CreateFile Failed\n");
return FALSE;
}
dwFileSize = GetFileSize(hFile, NULL);
hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize, NULL);
if (hFileMap == NULL) {
printf("CreateFileMapping Failed\n");
}
CloseHandle(hFile);
return hFileMap != NULL;
}
int main()
{
WCHAR filePathA[] = L"D:\\a.data"; // 512M 源文件
WCHAR filePathB[] = L"D:\\b.data"; // 130M 更新文件
DWORD dwFileSizeA = 0;
DWORD dwFileSizeB = 0;
HANDLE hFileMapA = NULL;
HANDLE hFileMapB = NULL;
DWORD start = 1024 * 1024 * 240; // 开始位置
DWORD end = dwFileSizeB; // 结束位置
DWORD dwFileBlock = 1024 * 1024 * 33; // 每次更新
clock_t startTime, endTime;
startTime = clock();
if (!GetFileMapHandle(filePathA, hFileMapA, dwFileSizeA)) {
goto exit;
}
printf("%p\t%d\n", hFileMapA, dwFileSizeA);
if (!GetFileMapHandle(filePathB, hFileMapB, dwFileSizeB)) {
goto exit;
}
printf("%p\t%d\n", hFileMapB, dwFileSizeB);
if (start > dwFileSizeA || dwFileSizeA - start < dwFileSizeB) {
goto exit;
}
for (DWORD i = 0; i < dwFileSizeB; i += dwFileBlock) {
if (i + dwFileBlock > dwFileSizeB) {
end = dwFileSizeB - i;
} else {
end = dwFileBlock;
}
LPVOID pFileBlockA = MapViewOfFile(hFileMapA, FILE_MAP_ALL_ACCESS, 0, start + i, end);
if (pFileBlockA == NULL) {
printf("MapViewOfFile Failed\n");
goto exit;
}
LPVOID pFileBlockB = MapViewOfFile(hFileMapB, FILE_MAP_ALL_ACCESS, 0, i, end);
if (pFileBlockA == NULL) {
printf("MapViewOfFile Failed\n");
UnmapViewOfFile(pFileBlockA);
goto exit;
}
#ifdef _DEBUG
printf("%p\t%p\n", pFileBlockA, pFileBlockB);
for (DWORD j = 1; j < end; j*=2) { // 抽查看下
printf("%c\t%c\n", *((unsigned char*)pFileBlockA + j), *((unsigned char*)pFileBlockB + j));
}
#endif // __DEBUG
memcpy(pFileBlockA, pFileBlockB, end);
UnmapViewOfFile(pFileBlockA);
UnmapViewOfFile(pFileBlockB);
}
exit:
if (hFileMapA != NULL) {
CloseHandle(hFileMapA);
}
if (hFileMapB != NULL) {
CloseHandle(hFileMapB);
}
endTime = clock();
printf("The run time is: %f's", (double)(endTime - startTime) / CLOCKS_PER_SEC);
return 0;
}
简单测试下
CreateFile /CreateFileMapping/
MapViewOfFile,逻辑应该差不多,具体参数再改改