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/ ...
随机推荐
- 孤荷凌寒自学python第七十七天开始写Python的第一个爬虫7
孤荷凌寒自学python第七十七天开始写Python的第一个爬虫7 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 今天的学习仍然是在纯粹对docx模 ...
- XX出行项目子系统-统计系统设计(定时器项目设计例子)
一. 引言 目前开发的XX出行系统,需要开发数据统计功能,鉴于约约出行系统已经在运营,并且有新版本的迭代,方便以后下个版本复用,遂新建一个子系统. 二. 架构设计 三. 具体实现 1.MySql数据库 ...
- python计算工资个税
# -*- coding: utf-8 -*- total = int(input("税前总计:")) #公积金10% Gongjijin = total * 0.1 print( ...
- 初涉 Deep Drive Dataset
Berkeley 大学最近推出的针对自动驾驶的街景数据集,号称比 Cityscapes 数据量更大,可泛化性更好. 语义实例分割(Semantic Instance Segmentation) 数据集 ...
- HDFS essay 2 - Clarify Name Node / Checkpoint Node/ Backup Node
为什么想用英文写了?我获取知识.技术的大部分途径都是通过英文,所以按照自己的理解用英文写下来也比较容易,另外,很多term都是不能翻译的,如果要持续学习技术和知识,那就不但要习惯去阅读,听,还要写,说 ...
- C#调用mingw的so库时无法加载DLL###.so 找不到指定的模块
使用C#调用mingw的so,报了c# 无法加载DLL“###.so”,: 找不到指定的程序. (异常来自 HRESULT:0x8007007E)开始以为是dll路径问题,使用全路径确认正确后仍然无法 ...
- Block的声明与定义语法
Block的声明 Block的声明与函数指针的声明类似 返回值类型(^变量名)(参数列表) Block的定义 ^返回值类型(参数列表) { 表达式 } 其中: 1 如果返回值类型是void,可以省略 ...
- 《C++常见问题及解答》
一.类 1. 常数据成员的初始化只能在构造函数的初始化列表中进行 2. 静态数据成员不可以在类内初始化 3. 创建一个对象时的构造函数的调用次序:对象成员的构造函数.对象自身的构造函数 4. 创建一个 ...
- 软工1816 · Alpha冲刺(2/10)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 与前后端敲定接口设计的细节 重新理清业务逻辑,对项目最初的设想进行一定修正 跟 ...
- eg_4
4. 编写一个程序,要求以树状结构展现特定的文件夹及其子文件(夹) import java.io.*; public class Test { public static void main(Stri ...