http://shushanyegui.duapp.com/?p=731

在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序

#include "stdafx.h"
#include <stdlib.h>
#include <windows.h> char* Read(LPCWSTR file)
{
HANDLE hFile = CreateFile(
(LPCWSTR)file,
GENERIC_READ,
,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
DWORD filesize = GetFileSize(hFile, NULL);
int size = filesize + ;
char *buff = (char *)malloc(sizeof(char)*size);
for (int i = ; i<size; i++)
{
buff[i] = ;
}
DWORD readBytes;
BOOL flag = ReadFile(hFile, buff, size, &readBytes, NULL);
if (flag == FALSE)
{
printf("ReadFile failed/n");
return "false";
}
CloseHandle(hFile);
return buff; } BOOL Write(LPCWSTR file, char *con)
{
HANDLE hFile = CreateFile(
(LPCWSTR)file,
GENERIC_WRITE | GENERIC_READ,
,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE)
{
return false;
}
//TCHAR buff[MAX_PATH];
DWORD wSize;
char buff[MAX_PATH];
sprintf_s(buff, "%s", con);
BOOL flag = WriteFile(hFile, buff, strlen(buff), &wSize, NULL);
if (!flag){
return false;
}
//缓冲区内容强制刷新至设备
if ( == FlushFileBuffers(hFile))
{
printf("Flush failed/n");
}
CloseHandle(hFile);
return true; }
void TcharToChar(const TCHAR * tchar, char * _char)
{
int iLength;
//获取字节长度
iLength = WideCharToMultiByte(CP_ACP, , tchar, -, NULL, , NULL, NULL);
//将tchar值赋给_char
WideCharToMultiByte(CP_ACP, , tchar, -, _char, iLength, NULL, NULL);
} void CharToTchar(const char * _char, TCHAR * tchar)
{
int iLength;
iLength = MultiByteToWideChar(CP_ACP, , _char, strlen(_char) + , NULL, );
MultiByteToWideChar(CP_ACP, , _char, strlen(_char) + , tchar, iLength);
} int main(int argc, char **argv){
LPCWSTR filename = TEXT("test.txt");
char *con = "Hey guys!!";
if (Write(filename, con))
{
MessageBox(NULL, TEXT("Write success!!!"), TEXT("OK"), MB_OK);
} char *buff = Read(filename);
TCHAR str[]; CharToTchar(buff, str); if (str)
{
TCHAR readBuff[MAX_PATH];
wsprintf(readBuff, TEXT("%s"), str);
OutputDebugString(readBuff);
MessageBox(NULL, readBuff, TEXT("OK"), MB_OK);
}
else {
MessageBox(NULL, TEXT("Oops! There happends something!!"), TEXT("ERROR"), MB_OK);
}
return ;
}

http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822216.html

http://baike.so.com/doc/6784090-7000692.html

lpMapAddress 对地址进行操作,就相当与操作文件了。
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
typedef struct __ListNode
{
char data[];
struct __ListNode *pNext;
}ListNode, *pListNode; int main(int argc, char **argv)
{
LPCWSTR file = TEXT("test.txt");
HANDLE hFile = CreateFile( //创建或打开文件内核对象
file,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
); if (hFile == INVALID_HANDLE_VALUE)
{
return false;
}
/*
DWORD dwWriteSize;
pListNode curr; //当前节点指针
pListNode head; //首节点
head = NULL;
char temp2[20] = { 0 };
for (int i = 0; i<10; i++)
{
curr = (pListNode)malloc(sizeof(ListNode));
sprintf(temp2, "%.1d\n", i);
strcpy(curr->data, temp2);
curr->pNext = head;
head = curr;
}
pListNode s;
s = head;
wchar_t buff[2] = L"";
while (s)
{
DWORD size = MultiByteToWideChar(CP_ACP, 0, s->data, -1, NULL, 0);
wchar_t *temp1 = (wchar_t *)malloc(size*sizeof(wchar_t));
memset(temp1, 0, size*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, s->data, -1, temp1, size);
WriteFile(hFile, temp1, sizeof(temp1), &dwWriteSize, NULL);
s = s->pNext;
}
/**/
DWORD filesize = GetFileSize(hFile, NULL);
//创建一个文件映射内核对象
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, , filesize, NULL);
if (hMap == INVALID_HANDLE_VALUE)
{
return false;
}
//将文件数据映射到进程的地址空间
LPSTR lpMapAddress = (LPSTR)MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, , , filesize);
if (lpMapAddress == NULL)
{
printf("MapView error!\n");
return -;
}
else
{
int m = ;
printf("----%d\n", filesize);
while (true)
{
if (m > filesize)
{
break;
}
if (lpMapAddress[m])
{
printf("%c\n", lpMapAddress[m]);
lpMapAddress[m] = ;//可以更改文件的值
}
m++; }
} UnmapViewOfFile(lpMapAddress);
CloseHandle(hMap);
CloseHandle(hFile);
return ;
}

下面是linux的版本

#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(){
int File;
struct stat sb;
unsigned char *startAddr; File = open("./OPWIN.bin",O_RDONLY);
//File = open("./test.txt",O_RDONLY);
fstat(File,&sb); printf("--------%d\n",sb.st_size);
startAddr=(unsigned char *)mmap(NULL,sb.st_size,
PROT_READ,MAP_PRIVATE,File,); //printf("%s",startAddr);
munmap(startAddr,sb.st_size);
close(File); }

windows内存映射文件的更多相关文章

  1. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  2. 《windows核心编程》 17章 内存映射文件

    内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...

  3. Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收

    之前以为两个互不相关的程序a.exe b.exe通信就只能通过网络,人家说可以通过发消息,我还深以为不然,对此,我表示万分惭愧. 之前课本上说的进程间通信,有共享内存.管道等之类的,但没有自己操刀写过 ...

  4. 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子

    进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create  mappin ...

  5. 《windows核心编程系列》十六谈谈内存映射文件

    内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件.将文件映射到内存中后,我们就可以在内存中操作他们了 ...

  6. Windows核心编程 第十七章 -内存映射文件(下)

    17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...

  7. Windows核心编程 第十七章 -内存映射文件(上)

    第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...

  8. Windows进程间通讯(IPC)----内存映射文件

    内存映射文件原理 内存映射文件是通过在虚拟地址空间中预留一块区域,然后通过从磁盘中已存在的文件为其调度物理存储器,访问此虚拟内存空间就相当于访问此磁盘文件了. 内存映射文件实现过程 HANDLE hF ...

  9. windows内存映射学习及帮助类实现

    本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...

随机推荐

  1. SpriteKit手机游戏摇杆JoyStick的使用 -- by iFIERO游戏开发教程

    ### 工欲善其事,必先利其器 有时候学习如何应用第三方库是非常重要的,因为我们不用再自己重复造轮子,在这里,我们就把原先利用重力感应来操控飞机改为用游戏摇杆joystick来操控,具体的操作如下:` ...

  2. 使用pycharm软件配置数据库可视化

    必须品: pycharm软件,专业版最好自带就有,社区版就需要安装下插件. 专业版直接会在右边的编辑框浮动,直接点开就可以配置. 如图所示,点开就可以配置相应的数据库, 点开配置完毕就可以使用了. 还 ...

  3. TW实习日记:第18天

    今天的bug没有那么多了,都是些小bug,一下就改好了.或者是接口那边数据返回的有问题,通知一下同事就ok了.主要今天是在赶功能进度,然而有一个功能模块需求里并没有写,实在是不知道要做成什么样子,真的 ...

  4. SSH:远程登陆

    SSH用于计算机之间的加密登录的前提是公钥为真,所以存在中间人攻击中间人攻击:与https协议不同,SSH协议的公钥是没有CA公证的,当对公钥的请求被中间截获时,中间人可以发出伪造公钥干坏事而不被识破 ...

  5. UVa 10082 - WERTYU 解题报告 - C语言

    1.题目大意: 输入一个错位的字符串(字母全为大写),输出原本想打出的句子. 2.思路: 如果将每个输入字符所对应的应输出字符一一使用if或者switch,则过于繁琐.因此考虑使用常量数组实现. 3. ...

  6. C语言链接数据库

    一.解释一下函数功能和用法 1.mysql_real_connect 函数原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, co ...

  7. pandas协助工具

    pandas有时候操作很不方便,也有可能是我不熟练吧,反正就是各种别扭.下面是我写的一个简单的json数据操作工具,能够完成简单的数据分析工作,后续会不断完善的 # coding=utf-8 impo ...

  8. 2019-1-92.4G射频芯片培训资料

    2019-1-92.4G射频芯片培训资料 培训 RF 小书匠  欢迎走进zozo的学习之旅. 2.4G芯片选型 2.4G芯片开发 Q&A 2.4G芯片选型 芯片类型 soc 防盗标签2.4G无 ...

  9. 计算器软件实现系列(六)windowform窗体+SQL+策略模式

    一 整体概述 这个计算器软件的功能和以前的功能基本上一样,只不过是数据的保存形式发生了变化,,以前用的是txt文件保存,现在更正用SQL数据库,现在更改了以前的文件保存形式,是三层架构中数据层的更换, ...

  10. # 团队作业MD

    队员姓名与学号 051501124 王彬(组长) 111500206 赵畅 031602215 胡展瑞 031602320 李恒达 031602131 佘岳昕 031602431 王源 0316022 ...