我有某种类型的只有文件句柄(FILE *)的读取器。 另一个进程不断写入一个我无法控制的文件。C:读取大于4 GB的文件
现在,当其他进程将图像附加到该文件时,文件大小很可能很快会超过4 GB的限制。
阅读器进程使用可从某个数据库中找到的图像文件的句柄,偏移量和长度读取该文件。
我的问题是,读者如何能够读取4GB大小后将出现的文件块。
我正在使用Win32机器。
编辑: 我也在使用FreeBSD机器。
我有某种类型的只有文件句柄(FILE *)的读取器。 另一个进程不断写入一个我无法控制的文件。C:读取大于4 GB的文件
现在,当其他进程将图像附加到该文件时,文件大小很可能很快会超过4 GB的限制。
阅读器进程使用可从某个数据库中找到的图像文件的句柄,偏移量和长度读取该文件。
我的问题是,读者如何能够读取4GB大小后将出现的文件块。
我正在使用Win32机器。
编辑: 我也在使用FreeBSD机器。
在FreeBSD上,stdio API不限于32位(4Gb)。
只要您使用64位整数来操纵偏移和长度,您应该没有问题阅读过去的4Gb。
如果您正在寻找FILE *,那么如果您位于32位主机上,则必须使用fseeko()而不是fseek()。 fseek()在32位机器上占用32位。 fseeko()采用所有FreeBSD体系结构中的64位的off_t
类型。
只需使用Windows上的标准C API,fread
,fwrite
就可以在大文件上正常工作。您需要_fseeki64
才能找到64位的位置。
你也可以使用普通的WinAPI(ReadFile
等),它也可以处理> 4个GiB文件而不会出现问题。
[编辑]:你真正需要的仅仅是一个64位的寻求,这ReadFile
通过OVERLAPPED
结构提供你当然也可以通过使用SetFilePointer
这是_fseeki64
相当于获得(如一些评论者提及。) 。阅读/写作从来都不是问题,不管文件大小,只求。
ReadFile()很少能处理> 4GB的文件,没有足够的虚拟内存。当然,你的意思是SetFilePointerEx()。 –
甚至是老式的'SetFilePointer'。 –
@Hans:'ReadFile'采用'OVERLAPPED'参数,'OVERLAPPED'具有64位偏移量。有什么问题?虚拟内存与它有什么关系? –
像'sprintf(buf,“%ld”,offset)''一样使用off_t是安全的。我将在DB中保存buf。 – Mayank
@Mayank,不,如果你使用的是32位主机,那将会中断。使用'sprintf(buf,“%lld”,(long long)offset);' – nos