急切求教超大文件的读写
超过4G以上的大文件,用常规方式读取就不行了,这两天查了下,
主要用:createFileMapping和mapviewofFile进行读,请问这两个函数该如果具体操作呢?
还有就是我如果想把文件里面我想要的某行,提取出来,该用那个函数储存呢?
比如我要第1行,第3行,每读到一行想要的,该如何储存在我另外一个文本中呢?
[解决办法]
CreateFile打开一个文件,把文件句柄交给CreateFileMapping建立一个映射对象。
通过映射对象可以调用MapViewOfFile把文件映射到内存地址上,这样你就可以通过访问内存直接读到文件的数据。
直接用ReadFile一样可以读超过4G的文件,除非你的文件系统不支持超过4G的文件。file mapping的好处仅仅在于如果你需要随机读取文件内容通过file mapping可以直接使用Windows系统的虚拟内存缓冲机制。
[解决办法]
#include <windows.h>#include <stdio.h>#include <tchar.h>int _tmain(int argc, _TCHAR *argv[]){HANDLE hFile;HANDLE hFMap;hFile = CreateFile(L"E:\\map.bin",GENERIC_READ|GENERIC_WRITE, // 可读可写0,NULL,CREATE_ALWAYS, // 总是建立新文件0,NULL);if (INVALID_HANDLE_VALUE == hFile) {_tprintf(_T("CreateFile() failed. code:%d\n"), GetLastError());}else {hFMap = CreateFileMapping( // 创建文件映射hFile,NULL,PAGE_READWRITE, // 读写1, // 4GB0, // 0x1 0000 0000 bytes= 2^32 bytes = 4GBNULL);if (INVALID_HANDLE_VALUE != hFMap) {PBYTE p = (PBYTE)MapViewOfFile( // 映射到进程空间hFMap,FILE_MAP_WRITE,0,0,1024 // 1K 大小);if (p != NULL) {memset(p, 0xFF, 1024); // 设置为0xFFUnmapViewOfFile(p);}}CloseHandle(hFMap);CloseHandle(hFile);}return 0;}
[解决办法]
直接fopen()后,fread()就是,设置读取偏移用:
_fseeki64()
获取文件长度用
_filelengthi64(m_pFile->_file)
[解决办法]
再次强调,mapping适合随机读写,不适合超大文件,如果你没办法一次性将文件全部映射,用mapping其实很麻烦
mapping的顺序读写效率和普通IO没有本质区别,随机读写的话,mapping可以直接寻址定位,比普通io的设置偏移要简单高效