内存映射文件

 Windows上,内存映射文件,使得大文件的读写不会消耗太多的内存,也减少了频繁的cpu指令。另外,windows上的进程间共享数据,也是通过内存映射文件的方式来实现。
刚好又遇到这个需求,需要在服务器上一次载入几十兆大小的文件,每个文件大约有100万条数据。所以温习一下这块内容。
使用内存映射文件,需要按下列操作步骤操作:
1,打开一个文件对象,也就是文件句柄了。
2,创建一个文件映射对象 。
3,获取文件映射对象在进程地址空间的指针。
当完成对内存映射文件操作时,执行下面这些步骤清理内存:
1,告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
2,关闭文件映射对象。
3,关闭文件句柄。
内存映射可以高效的对大文件进行读写操作,可以这样理解,这个文件在物理磁盘上的存储空间被作为虚拟内存使用了,你读写这块内存区域,就相当于读写文件。在效率上,比I/O文件系统高了很多。win32上的进程间消息传递SendMessage和PostMessage都是用到这种方法。
实际上如果只是单纯使用它,就不必深究原理,否则需要去看《Windows核心编程》。
代码是硬道理:
假设在E盘有一个测试文件test.txt,内容如下:

  
  
  
  
  1. #include "windows.h" 
  2. #include "stdio.h" 
  3.   
  4. int main() 
  5.     //文件对象 
  6.     TCHAR  STR[] = "hello world!"
  7.     HANDLE hFile = CreateFile("E:\\test.txt"
  8.     GENERIC_READ | GENERIC_WRITE, 
  9.     0, 
  10.     NULL, 
  11.     OPEN_ALWAYS, 
  12.     FILE_ATTRIBUTE_NORMAL, 
  13.     NULL); 
  14.     //映射对象 
  15.     HANDLE hFileMapping = CreateFileMapping(hFile, 
  16.     NULL, 
  17.     PAGE_READWRITE, 
  18.     0, 
  19.     0, 
  20.     NULL); 
  21.     //这里赋值了2个文件映射的指针,地址从文件头开始 
  22.     TCHAR *pbFile1 = (TCHAR *)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0); 
  23.     TCHAR *pbFile2 = (TCHAR *)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0); 
  24.     /* 
  25.     输出字符串的内容,可以看到的是,把整个文件当作字符串输出了。 
  26.     当然,如果文件中含有'\0'的字符,你看不到全部文件内容的输出。 
  27.     */ 
  28.     //两个输出的结果是一样的 
  29.     printf("%s\n", pbFile1); 
  30.     printf("%s\n", pbFile2); 
  31.     /* 
  32.     下面的操作是往这个pbFile1指向的地址写入点自定义的内容, 
  33.     然后比较pbFile2指向地址的值是否相应改变了。 
  34.     */ 
  35.     memcpy(pbFile1, STR, strlen(STR)); 
  36.     printf("%s\n", pbFile1); 
  37.     printf("%s\n", pbFile2); 
  38.     //清理指针和内存 
  39.     UnmapViewOfFile(pbFile1); 
  40.     UnmapViewOfFile(pbFile2); 
  41.     CloseHandle(hFileMapping); 
  42.     CloseHandle(hFile); 
  43.     return 0; 

你可能感兴趣的:(windows,职场,映射,休闲,内存映射文件)