VC6下如何读写超过4G的文件 VC6下如何读写超过4G的文件。要用那个函数,最好能有个简单的例子。硬板格式是NTFS 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CreateFile/ReadFile/WriteFile 应该是可以的 xxxEx吧,IStream吧,这类支持64位的,不过一般都是分段的。 CFile就可以啊?怎么了?我都读取80GB的文件呢怎么4GB啥问题? 都说可以,却没有实在的思路说明,我正在试用映射文件操作4G以上文件,但是一直失败,网上也没有详细的说明,文章不少,都是操作小文件的,我现在情况是,无法写入4G以后的字节,每当文件3.99G时提示磁盘空间不足,烦恼了3天了,唉。CreateFileMapping的高位和低位参数表示文件的大小,网上有文章说都输入0的话表示映射大小与文件一致,也就是说,可以一次映射4G以上字节。我读取5G文件时就这么映射的,输入都是0,也能读出来,既然读的话能映射4G,为什么创建一个大小为5G的映射对象就失败呢,提示空间不足,其实磁盘还有15G啊。纳闷。所以问题来了,如何使用该函数映射4G以后的字节,我的猜想是:是不是在映射前,使用SetFilePointer函数将文件指针移动到4G位置呢?函数SetFilePointer又可以与CreateFileMapping进行配合吗,我要试试,试完再说!!气死我了。 csdn上没有这方面的专家吗,过来指导一下吧,研究不出来啊,CreateFileMapping一次映射的字节只能4G一下,超一个字节就提示磁盘空间不足,那怎么对4G以上字节操作呢,除非分段,从文件末尾4G以内的便宜映射,这只是猜想,具体分段这个操作代码怎么实现还不会,不过我试过多次映射,就是用setfilepointer函数,在createfile之后定位文件到末尾,然后再以此定位后的文件句柄hfile进行映射,但是文件大小依然是本次映射的大小,比如原来500M,定位到末尾,再映射500M,写完之后这个文件还是500M,不会在原来500M之后追加,郁闷,到底怎么分段呢,一直试都没试出来。 试一下这样:extern UINT64 _fseeki64(FILE *stream, __int64 offset, long origin);#define fseek _fseeki64使用fread fwrite像平常一样读写即可...试过读写8G的文件,没有任何问题. fsetposfgetpos應該可以超過int吧 兄弟,我太傻了,我硬盘4个区,为什么就一头扎在fat32分区的f盘上写4G以上文件啊,又是用readfile,writefile,setfilepointer,又是fread,fwrite,fseek,又是内存映射文件,怎么试它就是超不过4G,到4G点上就空间不足,哎呀,气死我了,弄了3天,今天还到处上网问,傻死了,下午3点多,发现了F盘是fat32的,就去ntfs上一试,我靠,超过4G了,兴奋死我了,再接着测试,把保存断点的变量也改为了__int64,把fseek改为了_lseeki64,一测试断点续传也没问题了,哎呀,弱智死了。傻到极点了。 为什么创建一个大小为5G的映射对象就失败呢,提示空间不足,其实磁盘还有15G啊。纳闷。============================================================================还有15G?磁盘不够了,换大盘。内存映射文件是可以解决这个问题,但是那主要是频繁随机存取方面的优势。直接使用文件存取,CFile就够,偏移和字节数一律使用 ULONGLONG 8字节无符号整型,像普通文件一样。VC6以前是有一个ReadHuge和WriteHuge,后来废掉了,不要用那个。 fat32不可以写超过4G文件,ntfs可以还有之前说了需要分段映射 那是针对32bit操作系统 64bit系统不存在这个问题,指针范围远超4G fat32?读写时还需要考虑内存问题,一次读入内存是不可行的,需要分段处理。 LZ GOOGLE找CFile64这个类,能读取超过4G的文件.. 网速限制? 如何获取gif图片里的字母 CSDN 解封了 !!! 3年经验的c++程序员想换工作 如何找到xmldom.idl 文件? 哪位给提供fopen fread的源代码? 在线等待---接收GetProcAddress(hinst,"GetTcpTable")用什么类型的指针或变量?? Com Automation 谁能解释下这个程序特别是我标记的地方!谢谢! 求高效率合并文件算法 为什么我的 两个CSstring 用+链接报错? 大家来找茬,找找小错误
CreateFileMapping的高位和低位参数表示文件的大小,网上有文章说都输入0的话表示映射大小与文件一致,也就是说,可以一次映射4G以上字节。我读取5G文件时就这么映射的,输入都是0,也能读出来,既然读的话能映射4G,为什么创建一个大小为5G的映射对象就失败呢,提示空间不足,其实磁盘还有15G啊。纳闷。
所以问题来了,如何使用该函数映射4G以后的字节,我的猜想是:是不是在映射前,使用SetFilePointer函数将文件指针移动到4G位置呢?函数SetFilePointer又可以与CreateFileMapping进行配合吗,我要试试,试完再说!!气死我了。
extern UINT64 _fseeki64(FILE *stream, __int64 offset, long origin);
#define fseek _fseeki64
使用fread fwrite像平常一样读写即可...
试过读写8G的文件,没有任何问题.
fgetpos
應該可以超過int吧
============================================================================
还有15G?磁盘不够了,换大盘。
内存映射文件是可以解决这个问题,但是那主要是频繁随机存取方面的优势。
直接使用文件存取,CFile就够,偏移和字节数一律使用 ULONGLONG 8字节无符号整型,像普通文件一样。
VC6以前是有一个ReadHuge和WriteHuge,后来废掉了,不要用那个。
读写时还需要考虑内存问题,一次读入内存是不可行的,需要分段处理。