内存映射如何映射大文件,超过4G就报磁盘空间不足? 本帖最后由 VisualEleven 于 2013-07-12 09:59:39 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用你的代码成功创建了1G的文件没有报空间不足不过这个位置HANDLE hFile = CreateFile(_T("E;\\test.dat"),这个分号应该是你笔误吧 映射文件大小有限制,对于32位确实是限制4G,如果一个文件超过4G,就根据偏移量来映射文件,比如一个文件10G,第一次先从0开始映射到4G这段,操作完后再从4G位置开始再映射4G这一段,操作完后再第三次映射,从8G开始映射到最后也就是2G这段,这样10G的文件都以映射方式操作完了.dwFileOffsetHigh, dwFileOffsetLow这两个变量就是偏移量,你再看一下建立映射文件的函数,应该还有一个指定大小的参数 问题1:HANDLE hFile = CreateFile(_T("E;\\test.dat"),问题2:ULONGLONG lSpaceLen=5*1024*1024*1024;//5GB空间-->ULONGLONG lSpaceLen=(ULONGLONG)5*1024*1024*1024;//5GB空间 一、嗯,这个确实是笔误了,谢谢指正!二、说的有道理,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,但是后来我这个文件的数据已经达到了10GB,那么如何修改这个文件的尺寸呢? 啊,上面回帖引用错误了,非常抱歉,应该如下:有道理的,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,假如我现在CreateFileMapping成功了一个4GB文件,但是后来我这个文件的数据已经达到了10GB,那么关闭文件时是不是应该修改这个文件的尺寸为10GB?如何修改这个文件的尺寸呢? 有道理的,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,假如我现在CreateFileMapping成功了一个4GB文件,但是后来我这个文件的数据已经达到了10GB,那么关闭文件时是不是应该修改这个文件的尺寸为10GB?如何修改这个文件的尺寸呢?请问你试过3楼的回复了吗?我32位机,用你的代码加上3楼的修改,可以创建5G的文件。 感谢BeanJoy,我刚忙完回来,你的方法我回去试试,谢谢了! 二楼所说是错的,32位系统,内存映射文件却是64位的,即可以到16EB。二楼所说方法是用MapViewOfFile将Huge内存映射文件映射到进程的地址空间时的方法这句可能确实有问题,因为参与运算的常量会按int型看待,最终结果是一个32位值可将其中任一因子指定为64位的:ULONGLONG lSpaceLen=5ui64*1024*1024*1024;或者用UInt32x32To64ULONGLONG lSpaceLen=UInt32x32To64(5*1024,1024*1024); createfont后,删除了hdc还是使用原来的 关于SendDlgItemText 用了memcpy 运行后出现内存不可读,但是结果对的,为什么? 如何关闭桌面弹出的窗口 如何获得网页内的所有超连接? 求教:如何完成对这种按钮的操作 ●BCMenu的 GetSubBCMenu不能获得 BCMenu*,谁用过??? 网络多播 HttpSendRequest 怎么判断发送失败还是接收失败 在Win98下怎么直接读写物理内存? 窗口重绘问题 轻松捡分:到哪里可以找到VCL.H文件?
没有报空间不足
不过这个位置
HANDLE hFile = CreateFile(_T("E;\\test.dat"),
这个分号应该是你笔误吧
HANDLE hFile = CreateFile(_T("E;\\test.dat"),
问题2:
ULONGLONG lSpaceLen=5*1024*1024*1024;//5GB空间
-->
ULONGLONG lSpaceLen=(ULONGLONG)5*1024*1024*1024;//5GB空间
二、
说的有道理,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,但是后来我这个文件的数据已经达到了10GB,那么如何修改这个文件的尺寸呢?
有道理的,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,假如我现在CreateFileMapping成功了一个4GB文件,但是后来我这个文件的数据已经达到了10GB,那么关闭文件时是不是应该修改这个文件的尺寸为10GB?如何修改这个文件的尺寸呢?
请问你试过3楼的回复了吗?
我32位机,用你的代码加上3楼的修改,可以创建5G的文件。
二楼所说方法是用MapViewOfFile将Huge内存映射文件映射到进程的地址空间时的方法这句可能确实有问题,因为参与运算的常量会按int型看待,最终结果是一个32位值可将其中任一因子指定为64位的:ULONGLONG lSpaceLen=5ui64*1024*1024*1024;
或者用UInt32x32To64
ULONGLONG lSpaceLen=UInt32x32To64(5*1024,1024*1024);