- 主题:MapViewOfFile遇到的问题
#define PartSize 2*1024*1024 // 分块的大小2MB
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,PartSize,NULL);
lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i*PartSize, PartSize); // 增加的代码
if ( lpMapStartPos == NULL )
{
printf("\n映射原文件到内存映射失败:%d。",GetLastError());
return -1;
}
i=0的时候,MapViewOfFile可以映射成功。
i=1的时候,MapViewOfFile可以映射失败,GetLastError()的返回值是5。
我是想把文件分段的映射,遇到了上面的问题。不知道如何解决?
--
FROM 116.231.61.*
#include <stdio.h>
#include <windows.h>
#define PartSize 2*1024*1024 // 分块的大小2MB
int main(int argc,char * argv[])
{
HANDLE dstFile;
HANDLE hFileMap,hDstFileMap;
DWORD dwFileSize;
LPVOID lpMapStartPos,lpNewFilePos;
int FileLen;
char ext[256],destfilename[256];
int i = 0;
char *lpFileName = "01.flac";
HANDLE hFile = CreateFile(lpFileName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("打开原文件失败。\n");
return FALSE;
}
dwFileSize = GetFileSize(hFile, NULL);
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,PartSize,NULL);
if(hFileMap == NULL)
{
printf("创建原文件映射对象句柄失败:%d。\n",GetLastError());
CloseHandle(hFile);
return -1;
}
lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i * PartSize, 0);
if ( lpMapStartPos == NULL )
{
printf("%d\n.",i);
printf("映射原文件到内存映射失败:%d。\n",GetLastError());
return -1;
}
UnmapViewOfFile(lpMapStartPos); // 撤销第一部分的映射
// 第2部分的文件片段如何映射?
i++;
lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
if ( lpMapStartPos == NULL )
{
printf("映射原文件到内存映射失败:%d。\n",GetLastError());
printf("%d\n",i);
return -1;
}
UnmapViewOfFile(lpMapStartPos);
CloseHandle(hFileMap); // 关闭内存句柄
CloseHandle(hFile); // 关闭文件句柄
}
【 在 javame (yimin) 的大作中提到: 】
: #define PartSize 2*1024*1024 // 分块的大小2MB
: hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,PartSize,NULL);
: lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i*PartSize, PartSize); // 增加的代码
: ...................
--
FROM 116.231.61.*
CreateFileMapping指定的太小了吧
【 在 javame 的大作中提到: 】
: #define PartSize 2*1024*1024 // 分块的大小2MB
: hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,PartSize,NULL);
: lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i*PartSize, PartSize); // 增加的代码
: ...................
--
FROM 111.205.43.*
一个10G的文件如何映射,32位的系统,一次性无法全部映射成功。
我本来以为我的方法可以成功的,搜索了一圈都是一次性读入的。
看来我的这个方法是有问题的啊。
CreateFileMapping指定的太小了吧,我是想分段读入,看来这个方法在
32位系统是行不通的啊。
【 在 liushuoshu (刘硕鼠) 的大作中提到: 】
: CreateFileMapping指定的太小了吧
--
FROM 116.231.61.*
看一下CreateFileMapping的参数
【 在 javame 的大作中提到: 】
: 一个10G的文件如何映射,32位的系统,一次性无法全部映射成功。
: 我本来以为我的方法可以成功的,搜索了一圈都是一次性读入的。
: 看来我的这个方法是有问题的啊。
: ...................
--
FROM 111.205.43.*
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,PartSize,NULL);
我看不出我的参数有什么问题啊?
代码改成下面一次性读入,就没问题,你说再改哪个参数?
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
【 在 javame (yimin) 的大作中提到: 】
: #include <stdio.h>
: #include <windows.h>
: #define PartSize 2*1024*1024 // 分块的大小2MB
: ...................
--
FROM 116.231.61.*
char *lpFileName = "01.flac";
这个用full path。
--
FROM 114.241.231.*
试过了,还是老样子。
【 在 z16166 (Netguy) 的大作中提到: 】
: char *lpFileName = "01.flac";
: 这个用full path。
--
FROM 116.231.61.*
要给CreateFileMapping()传递整个文件的大小,而非固定的2MB。
CreateFileMapping()的参数:
dwMaximumSizeHigh
The high-order DWORD of the maximum size of the file mapping object.
dwMaximumSizeLow
The low-order DWORD of the maximum size of the file mapping object.
If this parameter and dwMaximumSizeHigh are 0 (zero), the maximum size of the file mapping object is equal to the current size of the file that hFile identifies.
【 在 javame 的大作中提到: 】
: 试过了,还是老样子。
:
--
修改:z16166 FROM 125.35.121.*
FROM 125.35.121.*