读书人

内存储器映射的使用实现大文件内容

发布时间: 2012-11-13 10:00:50 作者: rapoo

内存映射的使用——实现大文件内容倒序
内存映射文件使用的步骤:

    打开文件内核对象 CreateFile创建文件映射内核对象 CreateFileMapping将数据映射到地址空间 MapViewOfFile撤销文件数据的映射 UnmapViewOfFile关闭文件映射 CloseHandle关闭文件对象 CloseHandle

文件内容倒序代码:

// 1. 打开文件内核对象HANDLE hfile = CreateFile("F:\\MMFTEST.txt",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hfile == INVALID_HANDLE_VALUE){DWORD err = GetLastError();cerr << _T("Open File Error: %d",err) << endl;CloseHandle(hfile);return 0 ;}DWORD dwFileSize = GetFileSize(hfile,NULL);//2.创建文件映射内核对象HANDLE hfilemap = CreateFileMapping(hfile,NULL,PAGE_READWRITE,0,dwFileSize+sizeof(WCHAR),NULL); //增加一个\0的长度if (hfilemap == NULL){DWORD err = GetLastError();cerr << _T("Open File Map Error: %d",err) << endl;CloseHandle(hfilemap);CloseHandle(hfile);return 0 ;}//3.将数据映射到地址空间PVOID pbFile = MapViewOfFile(hfilemap,FILE_MAP_WRITE,0,0,0);if (pbFile == NULL){DWORD err = GetLastError();cerr << _T("Map File Error: %d",err) << endl;CloseHandle(hfilemap);CloseHandle(hfile);return 0 ;}//此处不考虑Unicode的情况PSTR pch = (PSTR)pbFile;//最后一位补0pch[dwFileSize/sizeof(CHAR)] = 0;_strrev(pch);//修复\r\n的错误pch = strchr(pch,'\n');while(pch != NULL){*pch++ = '\r';*pch++ = '\n';pch = strchr(pch,'\n');}//4.撤销文件数据的映射UnmapViewOfFile(pbFile);//5.关闭文件映射CloseHandle(hfilemap);//去掉补入的\0SetFilePointer(hfile,dwFileSize,NULL,FILE_BEGIN);SetEndOfFile(hfile);//6.关闭文件对象CloseHandle(hfile);


本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/8163571

读书人网 >编程

热点推荐