原文地址:http://www.cnblogs.com/yejiansnake/archive/2010/11/24/FileMapping.html
代码
1
#include
<
windows.h
>
2
3 void main()
4 {
5 HANDLE hFile = CreateFile(
6 " G:\\test.txt " , // 文件名
7 GENERIC_READ | GENERIC_WRITE, // 对文件进行读写操作
8 FILE_SHARE_READ | FILE_SHARE_WRITE,
9 NULL,
10 CREATE_ALWAYS, // 打开已存在文件
11 FILE_ATTRIBUTE_NORMAL,
12 0 );
13
14 HANDLE hMapFile = CreateFileMapping(
15 hFile,
16 NULL,
17 PAGE_READWRITE, // 对映射文件进行读写
18 2 ,
19 935 * 1024 * 1024 + 64 * 1024 , // 这两个参数共64位,所以支持的最大文件长度为16EB
20 NULL);
21
22 if (hMapFile == INVALID_HANDLE_VALUE)
23 {
24 CloseHandle(hFile);
25 return ;
26 }
27
28 // 把文件数据映射到进程的地址空间
29 void * pvFile = MapViewOfFile(
30 hMapFile,
31 FILE_MAP_READ | FILE_MAP_WRITE,
32 2 ,
33 64 * 1024 ,
34 0 );
35
36 DWORD dwError = GetLastError();
37
38 if (pvFile)
39 {
40 unsigned char * p = (unsigned char * )pvFile;
41
42 p[ 1 ] = 52 ;
43
44 // 结束
45 UnmapViewOfFile(pvFile); // 撤销映射
46 }
47
48 CloseHandle(hMapFile); // 关闭文件
49 CloseHandle(hFile); // 关闭文件
50 }
51
2
3 void main()
4 {
5 HANDLE hFile = CreateFile(
6 " G:\\test.txt " , // 文件名
7 GENERIC_READ | GENERIC_WRITE, // 对文件进行读写操作
8 FILE_SHARE_READ | FILE_SHARE_WRITE,
9 NULL,
10 CREATE_ALWAYS, // 打开已存在文件
11 FILE_ATTRIBUTE_NORMAL,
12 0 );
13
14 HANDLE hMapFile = CreateFileMapping(
15 hFile,
16 NULL,
17 PAGE_READWRITE, // 对映射文件进行读写
18 2 ,
19 935 * 1024 * 1024 + 64 * 1024 , // 这两个参数共64位,所以支持的最大文件长度为16EB
20 NULL);
21
22 if (hMapFile == INVALID_HANDLE_VALUE)
23 {
24 CloseHandle(hFile);
25 return ;
26 }
27
28 // 把文件数据映射到进程的地址空间
29 void * pvFile = MapViewOfFile(
30 hMapFile,
31 FILE_MAP_READ | FILE_MAP_WRITE,
32 2 ,
33 64 * 1024 ,
34 0 );
35
36 DWORD dwError = GetLastError();
37
38 if (pvFile)
39 {
40 unsigned char * p = (unsigned char * )pvFile;
41
42 p[ 1 ] = 52 ;
43
44 // 结束
45 UnmapViewOfFile(pvFile); // 撤销映射
46 }
47
48 CloseHandle(hMapFile); // 关闭文件
49 CloseHandle(hFile); // 关闭文件
50 }
51
结论:
1.CreateFileMapping 能打开很多大的文件,调用后文件即分配相应大小。
2.MapViewOfFile 的两个参数 DWORD dwFileOffsetHigh 与 DWORD dwFileOffsetLow 都必须为 64KB 的整型倍数,而参数 SIZE_T dwNumberOfBytesToMap 参数表示映射多少字节到内存,该值要根据实际机器内存大小而定,如果为 0 则函数默认为Offset 到 文件结尾的空间都映射,当内存不足而文件过大时会出错。
3.本机2G内存,已经使用了922M,测试最大能映射的大小只有935M。