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. Jmeter 接口自动化执行报错 无法找到类或者类的方法

    写好的自动化测试脚本在PC以及mac book 都执行正确,但是放到linux集成环境时就一直报错,报错类似如下 [jmeter] // Debug: eval: nameSpace = NameSp ...

  2. hello-jni Android.mk文件简析

    #删除旧变量 LOCAL_PATH := $(call my-dir) #返回当前目录 include $(CLEAR_VARS) #删除旧变量 #设置新变量 LOCAL_MODULE := hell ...

  3. Python中assert的作用?

    1. assert 的作用是什么? assert这个关键字我们称之为“断言”,当这个关键字后边的条件为假的时候,程序自动崩溃并抛出AssertionError的异常. 什么情况下我们会需要这样的代码呢 ...

  4. JavaScript实现无刷新评论及在IE下的剪切板访问(学习)

    1.无刷新评论 tips: appendChild:将新元素作为父元素的最后一个子元素进行添加. insertBefore:在一个指定的子节点之前插入一个节点 实现: <!DOCTYPE htm ...

  5. 互联网行业求职课-教你进入BAT

    互联网行业求职课--教你进入BAT 课时1. 课程内容介绍.导师介绍.服务安排和介绍等 课时2. 互联网行业.职业选择指导 互联网公司选择: 大公司:收获:大平台,系统思维,系统培训,系统性的发展,薪 ...

  6. TW实习日记:第22天

    今天开发项目的还没完成的功能点,没什么难的,样式复制粘贴,JSON表单配一配,接口调一调,基本就完成了.不过中间在写后台的一些接口时,发现被自己之前写的一些方法给坑了.为什么这样说呢,因为在之前的几个 ...

  7. TW实习日记:第20-21天

    为什么上周五没写呢,因为上周五一直在熟悉业务流程...根本不会写一些复杂的业务代码,因为没有业务流程图!!!在学校的上需求分析和UML建模课的时候,还有软件工程课的时候,想着这都什么鬼啊,听来干嘛,写 ...

  8. informix如何查询第一条记录

    1.select first 1 * from shop; 正序查询第一条数据 2.select first 1 * from shop order by create_time desc; 按创建时 ...

  9. 感谢信——Alpha版

    作为Thunder团队的leader,当时担任组长,说实话,确实是头脑一热,可后来,在确定选题时,看着大家都有自己的想法,看着大家都那么踊跃,而我因为性格的原因,总是难以做决定,导致选题这件事就开了几 ...

  10. ACM 第十六天

    计算几何 练习题: F - Beauty Contest POJ - 2187 Bessie, Farmer John's prize cow, has just won first place in ...