内存映射怎么映射大文件,超过4G就报磁盘空间不足

内存映射如何映射大文件,超过4G就报磁盘空间不足?
本帖最后由 VisualEleven 于 2013-07-12 09:59:39 编辑
代码如下:
HANDLE hFile = CreateFile(_T("E;\\test.dat"),
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ, 
NULL,
CREATE_ALWAYS, 
FILE_FLAG_SEQUENTIAL_SCAN, 
NULL);
ULONGLONG lSpaceLen=5*1024*1024*1024;//5GB空间
DWORD dwFileOffsetLow=lSpaceLen,dwFileOffsetHigh=(DWORD)(lSpaceLen>>32);
HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE, 
dwFileOffsetHigh, dwFileOffsetLow, NULL);

执行到这个函数就报“磁盘空间不足”,检查磁盘剩余空间是80GB,怎么会不足?请高手指点,谢谢!

------解决方案--------------------
我用你的代码成功创建了1G的文件
没有报空间不足
不过这个位置
HANDLE hFile = CreateFile(_T("E;\\test.dat"),
这个分号应该是你笔误吧
------解决方案--------------------
映射文件大小有限制,对于32位确实是限制4G,如果一个文件超过4G,就根据偏移量来映射文件,比如一个文件10G,第一次先从0开始映射到4G这段,操作完后再从4G位置开始再映射4G这一段,操作完后再第三次映射,从8G开始映射到最后也就是2G这段,这样10G的文件都以映射方式操作完了.dwFileOffsetHigh, dwFileOffsetLow这两个变量就是偏移量,你再看一下建立映射文件的函数,应该还有一个指定大小的参数
------解决方案--------------------
引用:
啊,上面回帖引用:

映射文件大小有限制,对于32位确实是限制4G,如果一个文件超过4G,就根据偏移量来映射文件,比如一个文件10G,第一次先从0开始映射到4G这段,操作完后再从4G位置开始再映射4G这一段,操作完后再第三次映射,从8G开始映射到最后也就是2G这段,这样10G的文件都以映射方式操作完了.dwFileOffsetHigh, dwFileOffsetLow这两个变量就是偏移量,你再看一下建立映射文件的函数,应该还有一个指定大小的参数

有道理的,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,假如我现在CreateFileMapping成功了一个4GB文件,但是后来我这个文件的数据已经达到了10GB,那么关闭文件时是不是应该修改这个文件的尺寸为10GB?如何修改这个文件的尺寸呢?
请问你试过3楼的回复了吗?
我32位机,用你的代码加上3楼的修改,可以创建5G的文件。
------解决方案--------------------
二楼所说
引用
映射文件大小有限制,对于32位确实是限制4G,

是错的,32位系统,内存映射文件却是64位的,即可以到16EB。
二楼所说方法是用MapViewOfFile将Huge内存映射文件映射到进程的地址空间时的方法

引用
ULONGLONG lSpaceLen=5*1024*1024*1024;
这句可能确实有问题,因为参与运算的常量会按int型看待,最终结果是一个32位值

可将其中任一因子指定为64位的:ULONGLONG lSpaceLen=5ui64*1024*1024*1024;
或者用UInt32x32To64