windows中内存映射文件
	Windows上,内存映射文件,使得大文件的读写不会消耗太多的内存,也减少了频繁的cpu指令。另外,windows上的进程间共享数据,也是通过内存映射文件的方式来实现。
	刚好又遇到这个需求,需要在服务器上一次载入几十兆大小的文件,每个文件大约有100万条数据。所以温习一下这块内容。
	使用内存映射文件,需要按下列操作步骤操作:
	1,打开一个文件对象,也就是文件句柄了。
	2,创建一个文件映射对象 。
	3,获取文件映射对象在进程地址空间的指针。
	当完成对内存映射文件操作时,执行下面这些步骤清理内存:
	1,告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
	2,关闭文件映射对象。
	3,关闭文件句柄。
	内存映射可以高效的对大文件进行读写操作,可以这样理解,这个文件在物理磁盘上的存储空间被作为虚拟内存使用了,你读写这块内存区域,就相当于读写文件。在效率上,比I/O文件系统高了很多。win32上的进程间消息传递SendMessage和PostMessage都是用到这种方法。
	实际上如果只是单纯使用它,就不必深究原理,否则需要去看《Windows核心编程》。
	代码是硬道理:
	假设在E盘有一个测试文件test.txt,内容如下:
	#include "windows.h"
	#include "stdio.h"
	 
	int main()
	{
	    //文件对象
	    TCHAR  STR[] = "hello world!";
	    HANDLE hFile = CreateFile("E:\\test.txt",
	    GENERIC_READ | GENERIC_WRITE,
	    0,
	    NULL,
	    OPEN_ALWAYS,
	    FILE_ATTRIBUTE_NORMAL,
	    NULL);
	    //映射对象
	    HANDLE hFileMapping = CreateFileMapping(hFile,
	    NULL,
	    PAGE_READWRITE,
	    0,
	    0,
	    NULL);
	    //这里赋值了2个文件映射的指针,地址从文件头开始
	    TCHAR *pbFile1 = (TCHAR *)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
	    TCHAR *pbFile2 = (TCHAR *)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
	    /*
	    输出字符串的内容,可以看到的是,把整个文件当作字符串输出了。
	    当然,如果文件中含有'\0'的字符,你看不到全部文件内容的输出。
	    */
	    //两个输出的结果是一样的
	    printf("%s\n", pbFile1);
	    printf("%s\n", pbFile2);
	    /*
	    下面的操作是往这个pbFile1指向的地址写入点自定义的内容,
	    然后比较pbFile2指向地址的值是否相应改变了。
	    */
	    memcpy(pbFile1, STR, strlen(STR));
	    printf("%s\n", pbFile1);
	    printf("%s\n", pbFile2);
	    //清理指针和内存
	    UnmapViewOfFile(pbFile1);
	    UnmapViewOfFile(pbFile2);
	    CloseHandle(hFileMapping);
	    CloseHandle(hFile);
	    return 0;
	}
相关新闻>>
- 发表评论
- 
				
- 最新评论 进入详细评论页>>








