本帖最后由 VisualEleven 于 2013-07-12 09:59:39 编辑

解决方案 »

  1.   

    我用你的代码成功创建了1G的文件
    没有报空间不足
    不过这个位置
    HANDLE hFile = CreateFile(_T("E;\\test.dat"),
    这个分号应该是你笔误吧
      

  2.   

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

  3.   

    问题1:
    HANDLE hFile = CreateFile(_T("E;\\test.dat"),
    问题2:
    ULONGLONG lSpaceLen=5*1024*1024*1024;//5GB空间
    -->
    ULONGLONG lSpaceLen=(ULONGLONG)5*1024*1024*1024;//5GB空间
      

  4.   

    一、嗯,这个确实是笔误了,谢谢指正!
    二、
    说的有道理,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,但是后来我这个文件的数据已经达到了10GB,那么如何修改这个文件的尺寸呢?
      

  5.   

    啊,上面回帖引用错误了,非常抱歉,应该如下:
    有道理的,可是这个用于读取已存在的文件可以理解,但是,如果我现在是要创建一个新的10GB的文件怎么实现?CreateFileMapping只能创建少于4GB的文件,假如我现在CreateFileMapping成功了一个4GB文件,但是后来我这个文件的数据已经达到了10GB,那么关闭文件时是不是应该修改这个文件的尺寸为10GB?如何修改这个文件的尺寸呢?
      

  6.   

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

  7.   

    感谢BeanJoy,我刚忙完回来,你的方法我回去试试,谢谢了!
      

  8.   

    二楼所说是错的,32位系统,内存映射文件却是64位的,即可以到16EB。
    二楼所说方法是用MapViewOfFile将Huge内存映射文件映射到进程的地址空间时的方法这句可能确实有问题,因为参与运算的常量会按int型看待,最终结果是一个32位值可将其中任一因子指定为64位的:ULONGLONG lSpaceLen=5ui64*1024*1024*1024;
    或者用UInt32x32To64
    ULONGLONG lSpaceLen=UInt32x32To64(5*1024,1024*1024);