// 創建文件對象
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ,FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
TRACE("創建文件對象失敗,錯誤代碼:%d\r\n", GetLastError());
return;
}
// 創建文件映射對象
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hFileMap == NULL)
{
TRACE("創建文件映射對象失敗,錯誤代碼:%d\r\n", GetLastError());
return;
}
// 得到系統分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
// 得到文件尺寸
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);///MSDN
HANDLE hFile = ::CreateFile(strFile, GENERIC_READ,FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
TRACE("創建文件對象失敗,錯誤代碼:%d\r\n", GetLastError());
return;
}
// 創建文件映射對象
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hFileMap == NULL)
{
TRACE("創建文件映射對象失敗,錯誤代碼:%d\r\n", GetLastError());
return;
}
// 得到系統分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
// 得到文件尺寸
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);///MSDN
// 偏移地址
__int64 qwFileOffset = 0;
__int64 T_newmap = 900 * dwGran;
// 塊大小
DWORD dwBlockBytes = 1000 * dwGran;//文件數據分段大小
if (qwFileSize - qwFileOffset < dwBlockBytes)
dwBlockBytes = (DWORD)qwFileSize;
__int64 qwFileOffset = 0;
__int64 T_newmap = 900 * dwGran;
// 塊大小
DWORD dwBlockBytes = 1000 * dwGran;//文件數據分段大小
if (qwFileSize - qwFileOffset < dwBlockBytes)
dwBlockBytes = (DWORD)qwFileSize;
// 映射視圖
char *lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,
(DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
if (lpbMapAddress == NULL)
{
TRACE("映射文件映射失敗,錯誤代碼:%d ", GetLastError());
return;
}
// 關閉文件對象
CloseHandle(hFile);
///////////讀文件數據
while(qwFileOffset < qwFileSize)
{
/******************** 讀文件 ***************************/
//read_eh(&lpbMapAddress)讀取已映射到內存的數據,
char *lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,
(DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),dwBlockBytes);
if (lpbMapAddress == NULL)
{
TRACE("映射文件映射失敗,錯誤代碼:%d ", GetLastError());
return;
}
// 關閉文件對象
CloseHandle(hFile);
///////////讀文件數據
while(qwFileOffset < qwFileSize)
{
/******************** 讀文件 ***************************/
//read_eh(&lpbMapAddress)讀取已映射到內存的數據,
//並將文件指針作相應後移(lpbMapAddress++),返回指針偏移量
qwFileOffset = qwFileOffset + read_eh(&lpbMapAddress); //修改偏移量
if (qwFileOffset > T_newmap)
{//當數據讀到90%時,爲防數據溢出,需要映射在其後的數據 T_newmap
UnmapViewOfFile(lpbMapAddress);//釋放當前映射
if ((DWORD)(qwFileSize - T_newmap) < dwBlockBytes)
dwBlockBytes = (DWORD)(qwFileSize - T_newmap);
lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,
(DWORD)(T_newmap >> 32), (DWORD)(T_newmap & 0xFFFFFFFF),dwBlockBytes);
// 修正參數
lpbMapAddress = lpbMapAddress + qwFileOffset - T_newmap;
T_newmap =T_newmap + 900 * dwGran;
if (lpbMapAddress == NULL)
{
TRACE("映射文件映射失敗,錯誤代碼:%d ", GetLastError());
return;
}
}
}
//釋放最後數據塊映射
UnmapViewOfFile(lpbMapAddress);
// 關閉文件映射對象句柄
CloseHandle(hFileMap);
qwFileOffset = qwFileOffset + read_eh(&lpbMapAddress); //修改偏移量
if (qwFileOffset > T_newmap)
{//當數據讀到90%時,爲防數據溢出,需要映射在其後的數據 T_newmap
UnmapViewOfFile(lpbMapAddress);//釋放當前映射
if ((DWORD)(qwFileSize - T_newmap) < dwBlockBytes)
dwBlockBytes = (DWORD)(qwFileSize - T_newmap);
lpbMapAddress = (char *)MapViewOfFile(hFileMap,FILE_MAP_READ,
(DWORD)(T_newmap >> 32), (DWORD)(T_newmap & 0xFFFFFFFF),dwBlockBytes);
// 修正參數
lpbMapAddress = lpbMapAddress + qwFileOffset - T_newmap;
T_newmap =T_newmap + 900 * dwGran;
if (lpbMapAddress == NULL)
{
TRACE("映射文件映射失敗,錯誤代碼:%d ", GetLastError());
return;
}
}
}
//釋放最後數據塊映射
UnmapViewOfFile(lpbMapAddress);
// 關閉文件映射對象句柄
CloseHandle(hFileMap);