内存映射文件示例zz

来源:互联网 发布:mac windows 远程桌面 编辑:程序博客网 时间:2024/06/05 10:57
  1. #include  
  2. #include  
  3. #include  
  4. #include  
  5. //这是一个对内存映射文件的demo程序,它打开一个文件,写入另一个文件中 
  6. //1、调用CreateFile()创建一个内核文件对象,它指出了文件的路径和读取 
  7. //   权限以及操作属性,后面的函数在读取属性上应该与之保持一致 
  8. //2、调用CreateFileMapping()创建文件映射内核对象,它相当于指出 
  9. //   了文件的物理存储的大小以及对象名,当大小设为0时,它表示与实际文件 
  10. //   大小一致,在读时,大小应不大于实际大小,在写时,可大于实际大小 
  11. //3、调用MapViewOfFile(),建立对映射文件的视图,也就是可以对文件的那 
  12. //   部分进行操作,之后,可以象操作内存块一样操作文件 
  13. //4、如果对文件进行了修改,需要及时更新,则调用FlushViewOfFile() 
  14. //5、调用UnmapViewOfFile()取消映射 
  15. int main(void)  
  16. {  
  17. HANDLE hFile;  
  18. HANDLE hMapFile;  
  19. HANDLE hFileWrite;  
  20. HANDLE hMapFileWrite;  
  21. LPBYTE lpMapView;  
  22. LPBYTE lpMapViewWrite;  
  23. int nFileSize;  
  24.     hFile = CreateFile("c:/calc.exe",GENERIC_READ,FILE_SHARE_READ,  
  25.         NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);  
  26. if(hFile == NULL)  
  27.     {  
  28.         printf("createfile is failed/n");  
  29. return 0;  
  30.     }  
  31.     nFileSize = GetFileSize(hFile, NULL);  
  32.     hFileWrite = CreateFile("c:/calc1.exe",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,  
  33.         NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);  
  34. if(hFileWrite == NULL)  
  35.     {  
  36.         printf("createfile is failed/n");  
  37. return 0;  
  38.     }  
  39.     hMapFile = CreateFileMapping(hFile,    // Current file handle.  
  40.         NULL,                              // Default security.  
  41.         PAGE_READONLY,                    // Read/write permission.  
  42.         0,                                 // Max. object size.  
  43.         0,                                 // Size of hFile.  
  44.         NULL);     
  45. if(hMapFile == NULL)  
  46.     {  
  47.         printf("createfilemapping is failed/n");  
  48.         CloseHandle(hFile);  
  49. return 0;  
  50.     }  
  51.     hMapFileWrite = CreateFileMapping(hFileWrite,    // Current file handle.  
  52.         NULL,                              // Default security.  
  53.         PAGE_READWRITE,                    // Read/write permission.  
  54.         0,                                 // Max. object size.  
  55.         nFileSize,                     // Size of hFile.  
  56.         NULL);     
  57. if(hMapFileWrite == NULL)  
  58.     {  
  59.         printf("createfilemapping is failed/n");  
  60.         CloseHandle(hFile);  
  61. return 0;  
  62.     }  
  63.     lpMapView = (unsigned char*)MapViewOfFile(hMapFile,FILE_MAP_READ,NULL,NULL,0);  
  64. if(lpMapView == NULL)  
  65.     {  
  66.         printf("MapView is failed/n");  
  67.         CloseHandle(hFile);  
  68.         CloseHandle(hMapFile);  
  69. return 0;  
  70.     }  
  71.     lpMapViewWrite = (unsigned char*)MapViewOfFile(hMapFileWrite,FILE_MAP_WRITE,NULL,NULL,0);  
  72. if(lpMapViewWrite == NULL)  
  73.     {  
  74.         printf("MapView is failed/n");  
  75.         CloseHandle(hFile);  
  76.         CloseHandle(hMapFile);  
  77. return 0;  
  78.     }  
  79.     memcpy(lpMapViewWrite, lpMapView, nFileSize);  
  80.     FlushViewOfFile(lpMapViewWrite,nFileSize);  
  81.     UnmapViewOfFile(lpMapView);  
  82.     CloseHandle(hFile);  
  83.     CloseHandle(hMapFile);  
  84.     CloseHandle(hFileWrite);  
  85.     CloseHandle(hMapFileWrite);  
  86.     getchar();  
  87. return 0;  
  88. }  
原创粉丝点击