VC6下如何读写超过4G的文件。要用那个函数,最好能有个简单的例子。硬板格式是NTFS

解决方案 »

  1.   

    CreateFile/ReadFile/WriteFile 应该是可以的
      

  2.   

    xxxEx吧,IStream吧,这类支持64位的,不过一般都是分段的。
      

  3.   

    CFile就可以啊?怎么了?我都读取80GB的文件呢怎么4GB啥问题?
      

  4.   

    都说可以,却没有实在的思路说明,我正在试用映射文件操作4G以上文件,但是一直失败,网上也没有详细的说明,文章不少,都是操作小文件的,我现在情况是,无法写入4G以后的字节,每当文件3.99G时提示磁盘空间不足,烦恼了3天了,唉。
    CreateFileMapping的高位和低位参数表示文件的大小,网上有文章说都输入0的话表示映射大小与文件一致,也就是说,可以一次映射4G以上字节。我读取5G文件时就这么映射的,输入都是0,也能读出来,既然读的话能映射4G,为什么创建一个大小为5G的映射对象就失败呢,提示空间不足,其实磁盘还有15G啊。纳闷。
    所以问题来了,如何使用该函数映射4G以后的字节,我的猜想是:是不是在映射前,使用SetFilePointer函数将文件指针移动到4G位置呢?函数SetFilePointer又可以与CreateFileMapping进行配合吗,我要试试,试完再说!!气死我了。
      

  5.   

    csdn上没有这方面的专家吗,过来指导一下吧,研究不出来啊,CreateFileMapping一次映射的字节只能4G一下,超一个字节就提示磁盘空间不足,那怎么对4G以上字节操作呢,除非分段,从文件末尾4G以内的便宜映射,这只是猜想,具体分段这个操作代码怎么实现还不会,不过我试过多次映射,就是用setfilepointer函数,在createfile之后定位文件到末尾,然后再以此定位后的文件句柄hfile进行映射,但是文件大小依然是本次映射的大小,比如原来500M,定位到末尾,再映射500M,写完之后这个文件还是500M,不会在原来500M之后追加,郁闷,到底怎么分段呢,一直试都没试出来。
      

  6.   

    试一下这样:
    extern UINT64 _fseeki64(FILE *stream, __int64 offset, long origin);
    #define fseek _fseeki64
    使用fread fwrite像平常一样读写即可...
    试过读写8G的文件,没有任何问题.
      

  7.   

    fsetpos
    fgetpos
    應該可以超過int吧
      

  8.   

    兄弟,我太傻了,我硬盘4个区,为什么就一头扎在fat32分区的f盘上写4G以上文件啊,又是用readfile,writefile,setfilepointer,又是fread,fwrite,fseek,又是内存映射文件,怎么试它就是超不过4G,到4G点上就空间不足,哎呀,气死我了,弄了3天,今天还到处上网问,傻死了,下午3点多,发现了F盘是fat32的,就去ntfs上一试,我靠,超过4G了,兴奋死我了,再接着测试,把保存断点的变量也改为了__int64,把fseek改为了_lseeki64,一测试断点续传也没问题了,哎呀,弱智死了。傻到极点了。
      

  9.   

    为什么创建一个大小为5G的映射对象就失败呢,提示空间不足,其实磁盘还有15G啊。纳闷。
    ============================================================================
    还有15G?磁盘不够了,换大盘。
    内存映射文件是可以解决这个问题,但是那主要是频繁随机存取方面的优势。
    直接使用文件存取,CFile就够,偏移和字节数一律使用 ULONGLONG 8字节无符号整型,像普通文件一样。
    VC6以前是有一个ReadHuge和WriteHuge,后来废掉了,不要用那个。
      

  10.   

    fat32不可以写超过4G文件,ntfs可以还有之前说了需要分段映射 那是针对32bit操作系统 64bit系统不存在这个问题,指针范围远超4G
      

  11.   

    fat32?
    读写时还需要考虑内存问题,一次读入内存是不可行的,需要分段处理。
      

  12.   

    LZ GOOGLE找CFile64这个类,能读取超过4G的文件..