读书人

文件映射怎么使用MapViewOfFile映射视

发布时间: 2012-09-22 21:54:54 作者: rapoo

文件映射如何使用MapViewOfFile映射视图至进程空间
大家好,由参数太多了,我试了一天,没有结果,所以特来麻烦大家..

如果我的文件已有数据263字节 ,我要接着写文件(追加数据),

那么怎么使用MapViewOfFile函数来设置定位置呢?

请帮忙回答一下,谢谢了.,

///省略代码.......
m_dwFileSize = 263;//文件已有长度
m_lpbFile = (PBYTE) MapViewOfFile(
m_hFileMap,
FILE_MAP_READ | FILE_MAP_WRITE,
//文件的偏移地址由DWORD型的参数dwFileOffsetHigh和dwFileOffsetLow组成的64位值来指定,
//而且必须是操作系统的分配粒度的整数倍,对于Windows操作系统,分配粒度固定为64KB。
(DWORD)(qwFileOffset>>32),
(DWORD)(qwFileOffset&0xFFFFFFFF),
dwBytesInBlock);//指定了数据文件的映射长度





[解决办法]
自己看看API一日一练吧

MapViewOfFile
[解决办法]
你建立映射文件时要大些,事先估计数据量来定.比如总数据量是64K+10;那么你就按这个字节数建立映射文件.然后再映射视图,这时就可以小些,但得按操作系统的粒度的整数倍来映射,第一次从偏移量为0开始建立:
qwFileOffset=0;
dwBytesInBlock=64*1024;//64K的整数倍;这里指定64K
m_lpbFile = (PBYTE) MapViewOfFile(
m_hFileMap,
FILE_MAP_READ | FILE_MAP_WRITE,
//文件的偏移地址由DWORD型的参数dwFileOffsetHigh和dwFileOffsetLow组成的64位值来指定,
//而且必须是操作系统的分配粒度的整数倍,对于Windows操作系统,分配粒度固定为64KB。
(DWORD)(qwFileOffset>>32),
(DWORD)(qwFileOffset&0xFFFFFFFF),
dwBytesInBlock);//指定了数据文件的映射长度
//然后操作m_lpbFile;
for(int i=0;i<dwBytesInBlock;i++)
{
m_lpbFile[i]=i;//操作数据
qwFileOffset++;
}
当达到dwBytesInBlock字节数时,再建立下一个映射视图:
qwFileOffset=236;//就是文件里已有数据的字节数:
m_lpbFile = (PBYTE) MapViewOfFile(
m_hFileMap,
FILE_MAP_READ | FILE_MAP_WRITE,
//文件的偏移地址由DWORD型的参数dwFileOffsetHigh和dwFileOffsetLow组成的64位值来指定,
//而且必须是操作系统的分配粒度的整数倍,对于Windows操作系统,分配粒度固定为64KB。
(DWORD)(qwFileOffset>>32),
(DWORD)(qwFileOffset&0xFFFFFFFF),
dwBytesInBlock);//指定了数据文件的映射长度

此时要注意操作m_lpbFile的维数仍然是从0开始,但对应的是文件里的dwBytesInBlock位置的数据
(int i=0;i<dwBytesInBlock;i++)
{
m_lpbFile[i]=i;//操作数据,此时对应的是文件里的从dwBytesInBlock位置开始的下一个dwBytesInBlock数量的字节
qwFileOffset++;
}
重复这步骤就可以把所有数据都操作完.
当实际操作的数据量少于建立的映射的文件的大小,这时实际建立的文件还是和当初建立的映射文件一样大,因些,再按实际字节数建立一个映射文件,把实际字节数据考到新建立的映射文件,保存新建立的映射文件,删除旧的映射文件
[解决办法]
当达到dwBytesInBlock字节数时,再建立下一个映射视图:
qwFileOffset=236;//就是文件里已有数据的字节数:去掉这句,因为上一个操作完后qwFileOffset已等于64*1024了,这句是误写的

读书人网 >软件架构设计

热点推荐