windows内存映射文件
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内存映射文件的更多相关文章
- 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...
- 《windows核心编程》 17章 内存映射文件
内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...
- Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收
之前以为两个互不相关的程序a.exe b.exe通信就只能通过网络,人家说可以通过发消息,我还深以为不然,对此,我表示万分惭愧. 之前课本上说的进程间通信,有共享内存.管道等之类的,但没有自己操刀写过 ...
- 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子
进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create mappin ...
- 《windows核心编程系列》十六谈谈内存映射文件
内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件.将文件映射到内存中后,我们就可以在内存中操作他们了 ...
- Windows核心编程 第十七章 -内存映射文件(下)
17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...
- Windows核心编程 第十七章 -内存映射文件(上)
第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...
- Windows进程间通讯(IPC)----内存映射文件
内存映射文件原理 内存映射文件是通过在虚拟地址空间中预留一块区域,然后通过从磁盘中已存在的文件为其调度物理存储器,访问此虚拟内存空间就相当于访问此磁盘文件了. 内存映射文件实现过程 HANDLE hF ...
- windows内存映射学习及帮助类实现
本文通过创建文件内存映射类,学习windows内存映射相关知识:创建内存映射文件后,可以按照内存操作方式操作文件:支持32位程序处理超过4G大小的文件. 感谢http://blog.csdn.net/ ...
随机推荐
- Java初始化方法:类、容器
Java初始化方法:类.容器 初始化类(非final): Struts2的DefaultActionMapper类中: public DefaultActionMapper() { ...
- [CF19B]Checkout Assistant
题目描述 Bob 来到一家现购自运商店,将 n 件商品放入了他的手推车,然后到收银台 付款.每件商品由它的价格 pi 和收银员扫描它的时间 ti 秒定义.当收银员正在扫 描某件商品时,Bob 可以从他 ...
- TW实习日记:第24-25天
项目的交付期是真的赶...一直在不断地修改一些小bug,然后消息推送功能出了一个问题,就是不知道为什么PC端会发送两次消息到移动端后台.其中第一条正常第二条会有乱码不正常,可以说是很奇怪了,一开始都认 ...
- Java学习 · 初识 多线程
多线程 1. 基础概念 a) 程序 Program i. 静态代码,指令集,应用程序执行的蓝本 b) 进程 Process i. 动态概念,正在运 ...
- psp1111
1 本周psp 2.本周进度条 3.本周累积进度图 代码累积折线图 博文字数累积折线图 4.本周PSP饼状图
- shiro控制登陆成功后跳回之前的页面
登陆之后跳回之前的页面是在做登陆注册模块时遇到的一个需求,也是很有必要的.若用户直接访问登陆页面,那可以控制它直接到首页,但是要用户没有登陆直接访问自己的购物车等需要经过身份认证的页面,或者因为ses ...
- Qt-排序
1.要求传入起始指针,总长度,单元素空间占用大小(sizeof(A[i])),判断函数. 判断函数参数类型为const void *,使用需要在函数内自行转换为对应类型, 返回值为整数型,升序排序时正 ...
- Dom的样式操作和属性操作
如果说web的研究对象是html和css,那么整个dom结构,包含html树和dom树的dom结构才是研究对象,而在整个页面呈现上面,js起到的作用则是异步的用户行为. 按照上面整个思路,获取dom元 ...
- C#常见函数
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- MAC锁屏不断网(快捷键启用屏保)
第一步:要设定锁定输入密码的设置,进入'系统偏好设置''安全性与隐私',将选项'进入睡眠或开始屏幕保护程序后'打勾,选'立即'. 第二步:到'launchpad'中的'其他'文件夹打开'Automat ...