2011-07-03 60 views
4

我有某种类型的只有文件句柄(FILE *)的读取器。 另一个进程不断写入一个我无法控制的文件。C:读取大于4 GB的文件

现在,当其他进程将图像附加到该文件时,文件大小很可能很快会超过4 GB的限制。

阅读器进程使用可从某个数据库中找到的图像文件的句柄,偏移量和长度读取该文件。

我的问题是,读者如何能够读取4GB大小后将出现的文件块。

我正在使用Win32机器。

编辑: 我也在使用FreeBSD机器。

回答

2

在FreeBSD上,stdio API不限于32位(4Gb)。

只要您使用64位整数来操纵偏移和长度,您应该没有问题阅读过去的4Gb。

如果您正在寻找FILE *,那么如果您位于32位主机上,则必须使用fseeko()而不是fseek()。 fseek()在32位机器上占用32位。 fseeko()采用所有FreeBSD体系结构中的64位的off_t类型。

+0

像'sprintf(buf,“%ld”,offset)''一样使用off_t是安全的。我将在DB中保存buf。 – Mayank

+0

@Mayank,不,如果你使用的是32位主机,那将会中断。使用'sprintf(buf,“%lld”,(long long)offset);' – nos

5

只需使用Windows上的标准C API,fread,fwrite就可以在大文件上正常工作。您需要_fseeki64才能找到64位的位置。

你也可以使用普通的WinAPI(ReadFile等),它也可以处理> 4个GiB文件而不会出现问题。

[编辑]:你真正需要的仅仅是一个64位的寻求,这ReadFile通过OVERLAPPED结构提供你当然也可以通过使用SetFilePointer这是_fseeki64相当于获得(如一些评论者提及。) 。阅读/写作从来都不是问题,不管文件大小,只求。

+0

ReadFile()很少能处理> 4GB的文件,没有足够的虚拟内存。当然,你的意思是SetFilePointerEx()。 –

+0

甚至是老式的'SetFilePointer'。 –

+1

@Hans:'ReadFile'采用'OVERLAPPED'参数,'OVERLAPPED'具有64位偏移量。有什么问题?虚拟内存与它有什么关系? –

相关问题