返回首页
当前位置: 主页 > 编程语言 > C/C++教程 >

c++文件系统概述(四)

时间:2015-06-29 09:34来源:电脑教程学习网 www.etwiki.cn 编辑:admin

六、内存映射文件

1.使用Mapping File提高文件读写的效率
 
 
/* *********************************************************************
 * file_map.c 使用Mapping File提高文件读写效率
 * *********************************************************************/
/*头文件*/
#include <Windows.h>
#include <stdio.h>
/*预处理声明*/
#define  BUFFSIZE 1024         //文件内存大小
#define  FILE_MAP_START 0x28804     //文件映射的起始位置
/*全局变量*/
LPTSTR lpcTheFile = TEXT("test.dat");     //文件名
/* ********************************************************************
 * int main(void)
 * 功能:演示使用文件mapping
 * 返回值:0代表执行完成,1代表发生错误
 * ********************************************************************/
int  main(void)
{
HANDLE hMapFile;    //文件内存映射区域的句柄
HANDLE hFile;           //文件句柄
DWORD dBytesWritten;    //写入的字节数
DWORD dwFileSize;    //文件大小
DWORD dwFileMapSize;    // 文件映射的大小
DWORD dwMapViewSize;   //  视图(view)的大小
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字节(在32位平台下,一个整形为4个字节)
for ( i = 0; i < 65535; i++)
{
WriteFile(hFile, &i, sizeof(i), &dBytesWritten, NULL);
}
//查看写入完成后的文件大小
dwFileSize = GetFileSize(
                                  hFile,
  NULL
  );
printf("文件大小:%d\n",dwFileSize);
//获取系统信息,内存分配粒度
//获取分配粒度,进行下面计算
//目的是为了映射的数据与系统内存分配粒度对其,提高内存访问率
GetSystemInfo(&SysInfo);
dwSysGran = SysInfo.dwAllocationGranularity;
//计算Mapping的起始位置
dwFileMapStart = (FILE_MAP_START / dwSysGran) * dwSysGran;
//计算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("NapViewOfFile error :%d\n",GetLastError());
return 1;
}
printf("文件 map view 相对于文件的起始位置:0x%x\n",dwFileMapStart);
printf("文件map view 的大小:x%x\n",dwFileMapSize);
printf("文件Mapping对象的大小:x%x\n",dwFileMapSize);
printf("从相对于map view 0x%x字节的位置读取数据,",iViewDelta);
//将指向数据的指针偏移,到达我们关心的地方
pData = (PCHAR)lpMapAddress + iViewDelta;
//读取数据,复制给变量
iData = *(PINT)pData;
//显示读取数据
printf("为:x%.8x\n",iData);
//从mapping中复制数据
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开始的字节使用xff填充。\n");
//关闭mapping对象
if (!CloseHandle(hMapFile))
{
printf("\nClosing the mapping obiect error %d!",GetLastError());
}
//关闭文件
if (!CloseHandle(hFile))
{
printf("\nError %ld occured closing the file !",GetLastError());
}
getchar();
return 0;
}

2.通过Mapping File在进程间传递数据

/*头文件*/
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
/*预处理申明*/
#define BUF_SIZE 256
/*全局变量*/
LPTSTR szName = TEXT("SharedFileMappingObject");
LPTSTR szMsg = TEXT("进程消息");

/* **********************************************************************
 * int main(void)
 * 功能:演示文件Mapping共享内存,写入数据到共享内存
 * 返回值:0代表执行完成,1代表发生错误
 * *********************************************************************/
void main(int argc,PCHAR argv[])
{
//文件映射句柄
HANDLE hMapFile;
//共享数据缓冲区指针
LPTSTR pBuf;
//创建命名的文件映射,不代表任务硬盘上的文件
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUF_SIZE,
szName
);
if (hMapFile == NULL || INVALID_HANDLE_VALUE)
{
printf("CreateFileMapping error :%d\n",GetLastError());
return;
}
//创建View
pBuf = (LPTSTR)MapViewOfFile(
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE
);
if (pBuf == NULL)
{
printf("MapViewOfFile error %d\n",GetLastError());
return;
}
//将共享数据复制到文件映射中,如果运行时输入了参数则使用参数
if (argc == 1)
{
CopyMemory((PVOID)pBuf,szMsg,strlen(szMsg));
}
else
{
DWORD dwCopyLen = strlen(argv[1]) < BUF_SIZE ? strlen(argv[1]) : BUF_SIZE;
CopyMemory((PVOID)pBuf,argv[1],dwCopyLen);
}
printf("运行程序,完成运行后,按任意键退出。");
getch();
//取消映射,退出
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
顶一下
(0)
0%
踩一下
(0)
0%
标签(Tag):C语言
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐内容