SDK使用 Mapping File 提高文件读写效率

/*使用 Mapping File 提高文件读写效率*/

 /*头文件*/
#include<windows.h>
#include<stdio.h>

/*预处理申明*/
#define BUFFSIZE 1024              //内存大小
#define FILE_MAP_START 0x28804     //文件映射的起始位置

/*全局变量*/
LPSTR lpcTheFile = TEXT("test.bat");  //文件名

/*********************************************
//int main(void)
//功能:演示使用文件mapping
//返回值:0 代表执行成功,1代表执行发生错误
**********************************************/
int main(void)
{
 HANDLE hMapFile;            //文件内存映射区域的句柄
 HANDLE hFile;               //文件的句柄
 DWORD dByteWritten;         //写入的字节数
 DWORD dwFileSize;           //文件大小
 DWORD dwFileMapSize;        //文件映射的大小
 DWORD dwMapViewSize;        //视图的大小
 DWORD dwFileMapStart;       //文件映射视图的起始位置
 DWORD dwSysGran;            //系统内存分配粒度
    SYSTEM_INFO SysInfo;        //系统信息
 LPVOID lpMapAddress;        //内存营社区与的起始位置
 PCHAR pData;                //数据
 INT i;                      //循环变量
 INT iData;
 INT iViewDelta;     
 BYTE cMapBuffer[32];        //存储从mapping中计出的数据

 //创建文件
 hFile = CreateFile(lpcTheFile,
  GENERIC_READ|GENERIC_WRITE,
  0,
  NULL,
  CREATE_ALWAYS,
  FILE_ATTRIBUTE_NORMAL,
  NULL);

 //判断文件是否创建成功
 if(hFile == INVALID_HANDLE_VALUE)
 {
  printf("CreateFile error\n", GetLastError());
  return 1;
 }

 //依次写入整数,一共写入65535 个整数
 // 在32平台下,大小为65535*4字节(一个整数四个字节)
 for( i=0; i<65535; i++)
 {
  WriteFile(hFile, &i, sizeof(i), &dByteWritten, NULL);
 }

 //查看写入完成后的文件大小
 dwFileSize = GetFileSize(hFile, NULL);
 printf("文件的大小:%d\n",dwFileSize);

 //获取系统信息,内存分配粒度
 //获取分配粒度,进行下面的计算
 //目的是为了映射的数据与系统内存分配粒度对齐,提高内存访问率

 GetSystemInfo( &SysInfo);
 dwSysGran = SysInfo.dwAllocationGranularity;

 //计算mapping的起始位置
 dwFileMapStart = (FILE_MAP_START / dwSysGran) * dwSysGran;  // FILE_MAP_START 预定义

 //计算mapping view 的大小
 dwMapViewSize = (FILE_MAP_START % dwSysGran) + BUFFSIZE;

 //计算mapping的大小
 dwFileMapSize = FILE_MAP_START + BUFFSIZE;

 //计算需要读取的数据的偏移
 iViewDelta = FILE_MAP_START - dwFileMapStart;
 
 //创建 File mapping
 hMapFile = CreateFileMapping( hFile,          //需要映射的文件的句柄
  NULL,            //安全选项、默认
  PAGE_READWRITE,  //可读、可写
  0,               //mapping对象的大小、高位
  dwFileMapSize,   //mapping对象的大小、低位
  NULL);           //mapping对象名字

 if(hMapFile == NULL)
 {
  printf("CreateFileMapping error:%d\n",GetLastError());
  return 1;
 }

 //映射 view
 lpMapAddress = MapViewOfFile(hMapFile,   //mapping 对象的句柄
  FILE_MAP_ALL_ACCESS,                 //可读、可写
  0,                                   //映射的文件偏移,高位
  dwFileMapStart,                       //映射的文件偏移,低位
  dwMapViewSize);                      //映射到View的数据大小
 if(lpMapAddress == NULL)
 {
  printf("MapViewOfFile error:%d\n",GetLastError());
  return 1;
 }
 printf("文件map view 相对于文件的起始位置:0x%x\n", dwFileMapStart);
 printf("文件map view 的大小:0x%x\n",dwMapViewSize);
 printf("文件mapping对象的大小:0x%x\n",dwFileMapSize);
 printf("从相对 map view 0x%x 字节的位置读取数据,",iViewDelta);

 //将指向数据的指针偏移,到达我们关心的地方
 pData = (PCHAR) lpMapAddress + iViewDelta;
 //读取数据,赋值给变量
 iData = *(PINT)pData;
 //显示读取的数据
 printf("为0x%.8x\n",iData);

 //从mapping 中复制数据,32个字节,并打印
 CopyMemory( cMapBuffer,
    lpMapAddress,
    32);
 printf("lpMapAddress起始的字节是:");
 for( i=0; i<32; i++)
 {
  printf("0x%.2x ", cMapBuffer[i]);
 }
 //将mapping的前32个字节用xff填充
 FillMemory(lpMapAddress, 32, (BYTE)0xff);
 //将映射的数据写回到硬盘上
 FlushViewOfFile( lpMapAddress, dwMapViewSize);
 printf("\n已经将lpMapAddress 开始的32字节使用xff填充。\n");

 //关闭mapping对象
 if(!CloseHandle(hMapFile))
 {
  printf("\nclose the mapping object error %d!",GetLastError());
 }
 //关闭文件
 if(!CloseHandle(hFile))
 {
  printf("\nError %ld occurred closing the file!",GetLastError());
 }
 return 0;
}

;