用C#实现的内存映射
来源:互联网 发布:mac u盘刻录dmg 编辑:程序博客网 时间:2024/06/07 23:05
当文件过大时,无法一次性载入内存时,就需要分次,分段的载入文件
主要是用了以下的WinAPI
LPVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap);
MapViewOfFile() 函数负责把文件数据映射到进程的地址空间,参数hFileMappingObject 为 CreateFileMapping()返回的文件映像对象句柄。参数dwDesiredAccess则再次指定了对文件数据的访问方式,而且同样要与 CreateFileMapping()函数所设置的保护属性相匹配。虽然这里一再对保护属性进行重复设置看似多余,但却可以使应用程序能更多的对数据的保护属性实行有效控制。MapViewOfFile()函数允许全部或部分映射文件,在映射时,需要指定数据文件的偏移地址以及待映射的长度。其中,文件的偏移地址由DWORD型的参数dwFileOffsetHigh和dwFileOffsetLow组成的64位值来指定,而且必须是操作系统的分配粒度的整数倍,对于Windows操作系统,分配粒度固定为64KB。当然,也可以通过如下代码来动态获取当前操作系统的分配粒度:
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
DWORD dwAllocationGranularity = sinf.dwAllocationGranularity;
参数dwNumberOfBytesToMap指定了数据文件的映射长度,这里需要特别指出的是,对于Windows 9x操作系统,如果MapViewOfFile()无法找到足够大的区域来存放整个文件映射对象,将返回空值(NULL);但是在Windows 2000下,MapViewOfFile()只需要为必要的视图找到足够大的一个区域即可,而无须考虑整个文件映射对象的大小。
由此看出,分页映射文件时,每页的起始位置startpos,必须为64K的整数倍。
以下贴出源代码,防止忘记了
- 用C#实现的内存映射
- c#实现内存映射文件共享内存
- C# 多重映射的实现!
- C++与C#的内存映射
- 内存映射文件 C#
- 文件映射,共享内存的实现
- 用内存映射实现posix消息队列
- C# 实现uPnP映射
- C#实现对象映射
- 汇编中内存映射文件的概念 and 内存映射文件的实现原理
- c# 内存共享、内存映射文件
- C# 用内存映射文件读取大文件(.txt)
- OD的内存映射窗口是怎么实现的?
- C++Builder实现内存映射
- 内存映射实现进程通讯
- mmapExample.c--内存映射实现文件的复制
- Java使用内存映射实现大文件的上传
- Java使用内存映射实现大文件的上传
- Hibernate学习笔记(四)
- 一切都是最好的安排
- 使用命令安装和卸载服务
- 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒
- IPhone短信设置
- 用C#实现的内存映射
- Hibernate学习笔记(五)
- CISCO DHCP 配置
- win32中SetCapture 和 ReleaseCapture的使用
- Android 联网监控抓包工具的制作(tcpdump的使用)
- jsp 九大内置对象
- 住房商业贷款利率、每万元需付利息
- 转载: WebView学习指南
- Hibernate学习笔记(六)