看windows核心编程17章复习内存映射方面的知识,看到了一系列的一个文件0个缓存,一个文件一个缓存等的简单说明,自己按照
自己的本意写了个计数和记录他们之间读写或者映射数据的时间差别的工程。
// 内存映射处理大文件.cpp : 定义控制台应用程序的入口点。
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include<winnt.h>
using namespace std;
string GetValue( TCHAR *, const TCHAR *); //根据name得value
void main(int argc, char* argv[])
{
// 创建文件对象(C: est.tsr)
HANDLE hFile = CreateFile("E:/862.exe", GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("创建文件对象失败,错误代码:%d ", GetLastError());
return;
}
// 创建文件映射对象
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hFileMap == NULL)
{
printf("创建文件映射对象失败,错误代码:%d ", GetLastError());
return;
}
// 得到系统分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD AlignGrainSize = SysInfo.dwAllocationGranularity;//可以分配虚拟内存的起始地址的粒度。
// 得到文件尺寸
DWORD dwFileSizeHigh;
__int64 FileSize = GetFileSize(hFile, &dwFileSizeHigh);//返回到低字节 高字节为空则大文件会出错,也不一定
FileSize |= (((__int64)dwFileSizeHigh) << 32);//或还是自己
// 关闭文件对象
CloseHandle(hFile);
// 偏移地址
__int64 qwFileOffset = 0;
// 块大小
DWORD dwBlockBytes = 0;
dwBlockBytes = (DWORD)FileSize;
if (qwFileOffset >= 0)
{
// 映射视图
DWORD start, end;
start = GetTickCount();
TCHAR *lpbMapAddress = (TCHAR *)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS,
0, 0,
dwBlockBytes);
if (lpbMapAddress == NULL)
{
printf("映射文件映射失败:%d ", GetLastError());
return;
}
int j = 0;
for (DWORD i = 0; i < dwBlockBytes; i++)
{
//if (lpbMapAddress[i] == 0)
//{
j++;
//}
/*char*v1 = strstr(lpbMapAddress, "NIHAO");
//if (v1 != NULL)
{
printf("%5s
", v1);
goto Exit;
}*/
}
printf("%d", j);
// 撤销文件映像
UnmapViewOfFile(lpbMapAddress);
end = GetTickCount();
printf("time=%d
", end - start);
}
// 关闭文件映射对象句柄
CloseHandle(hFileMap);
getchar();
Sleep(6000);
}