我正在制作一个用c读取磁盘映像的程序。我试图使某些东西可移植,所以我不想使用太多特定于操作系统的库。我知道有许多磁盘映像是非常大的文件,但我不确定如何支持这些文件。
我已经阅读了fseek
,它似乎使用不保证支持超过231-1的值的long int
。fsetpos
似乎支持fpos_t
更大的值,但不能确定绝对位置。我也考虑过使用fseek
的几个相对搜索,但我不确定这是否可移植。
我如何在C中支持可移植的大文件?
没有可移植的方法。
在Linux上有fseeko()
和ftello()
,对(需要一些定义,检查ftello()
)。
在Windows上,我相信你必须使用_fseeki64()
和_ftelli64()
#ifdef
是你的朋友
pread()
可以在任何posix兼容的平台(OS X, Linux, BSD等)上工作。这在Windows上是没有的,但Windows有很多标准的东西是错误的;这将不是你的代码库中唯一需要Windows特殊情况的东西。
你不能在标准c中做到这一点,即使使用相对查找,在某些体系结构中也是不可能的。
一种方法是在编译时检查平台。您可以只检查LONG_MAX的值,如果它不够大就抛出编译错误。但是,即使这样也不能保证底层文件系统支持大于2或4GB的文件。
一个更好的方法是使用编译器提供的预处理器宏来检查您的代码正在编译的操作系统,并编写特定于操作系统的操作系统。操作系统应该提供一种方法来检查文件系统是否实际支持大于2GB或4GB的文件。