内存映射文件存储空间不够、
答案:1 悬赏:0
解决时间 2021-12-13 03:10
- 提问者网友:花之森
- 2021-12-12 04:19
求指导
最佳答案
- 二级知识专家网友:啵啵桃汀
- 2021-12-12 04:38
设一个偏移量,不要映射那么多。下面是别人的处理方法,抄来给你:
使用内存映射文件处理大文件的代码示例:
1 SYSTEM_INFO sinf;
2 GetSystemInfo(&sinf);
3
4 // Open the file for reading and writing.
5 HANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0,
6 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
7 if (hFile == INVALID_HANDLE_VALUE) {
8 chMB("File could not be opened.");
9 return(FALSE);
10 }
11
12 // Get the size of the file (I assume the whole file can be mapped) in bytes.
13 DWORD dwFileSize = GetFileSize(hFile, NULL);
14
15 // Create the file-mapping object.
16 HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE,
17 0, dwFileSize, NULL);
18 if (hFileMap == NULL) {
19 chMB("File map could not be opened.");
20 CloseHandle(hFile);
21 return(FALSE);
22 }
23
24 DWORD map_data_offset = 0;
25 DWORD bytes_mapped = sinf.dwAllocationGranularity;
26 PVOID pvFile = NULL;
27 PSTR ps_ptr = NULL;
28
29 while(dwFileSize > 0)
30 {
31 if(dwFileSize < bytes_mapped)
32 {
33 pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, map_data_offset, dwFileSize);
34 //对字符数组pvFile的处理
35 map_data_offset += dwFileSize;
36 dwFileSize = 0;
37 }
38 else
39 {
40 pvFile = MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,map_data_offset,bytes_mapped);
41 //对字符数组pvFile的处理
42 map_data_offset += bytes_mapped;
43 dwFileSize -= bytes_mapped;
44 }
45 }
46 // Clean up everything before exiting.
47 UnmapViewOfFile(pvFile);
48 CloseHandle(hFileMap);
49 // Remove trailing zero character added earlier.
50 SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN);
51 CloseHandle(hFile);
文件映射对象存储于内核地址范围是所有操作系统的进程共享的,而MapViewOfFile文件映射地址空间是存在于进程的私有地址空间中,要想指定地址空间首地址可用MapViewOfFileEx函数,但只是建议首地址。
使用内存映射文件处理大文件的代码示例:
1 SYSTEM_INFO sinf;
2 GetSystemInfo(&sinf);
3
4 // Open the file for reading and writing.
5 HANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0,
6 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
7 if (hFile == INVALID_HANDLE_VALUE) {
8 chMB("File could not be opened.");
9 return(FALSE);
10 }
11
12 // Get the size of the file (I assume the whole file can be mapped) in bytes.
13 DWORD dwFileSize = GetFileSize(hFile, NULL);
14
15 // Create the file-mapping object.
16 HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE,
17 0, dwFileSize, NULL);
18 if (hFileMap == NULL) {
19 chMB("File map could not be opened.");
20 CloseHandle(hFile);
21 return(FALSE);
22 }
23
24 DWORD map_data_offset = 0;
25 DWORD bytes_mapped = sinf.dwAllocationGranularity;
26 PVOID pvFile = NULL;
27 PSTR ps_ptr = NULL;
28
29 while(dwFileSize > 0)
30 {
31 if(dwFileSize < bytes_mapped)
32 {
33 pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, map_data_offset, dwFileSize);
34 //对字符数组pvFile的处理
35 map_data_offset += dwFileSize;
36 dwFileSize = 0;
37 }
38 else
39 {
40 pvFile = MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,map_data_offset,bytes_mapped);
41 //对字符数组pvFile的处理
42 map_data_offset += bytes_mapped;
43 dwFileSize -= bytes_mapped;
44 }
45 }
46 // Clean up everything before exiting.
47 UnmapViewOfFile(pvFile);
48 CloseHandle(hFileMap);
49 // Remove trailing zero character added earlier.
50 SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN);
51 CloseHandle(hFile);
文件映射对象存储于内核地址范围是所有操作系统的进程共享的,而MapViewOfFile文件映射地址空间是存在于进程的私有地址空间中,要想指定地址空间首地址可用MapViewOfFileEx函数,但只是建议首地址。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯