我需要使用C来访问大于2GB的文件。在程序的一次运行过程中,将从文件中读取可变数量的字节,并保存下一个位置的位置。 在程序的下一次运行期间,读取文件位置并从该位置开始读取多个字节。
复杂的是,偶尔文件可能被压缩,通过复制到一个新的文件,减less任何已经被读取的字节(我认为复制是唯一的方法来做到这一点)。 以这种方式移除的字节数也将被保存。
我需要知道从原始开始的文件的当前位置与另一个文件同步。 这应该很容易,因为它只是(current_offset + deleted_bytes)。
不容易的原因是fseek只使用长整型索引,将文件限制为2GB,而fsetpos使用位置索引的fpos_t结构,这不是一个数字,不能来回转换。 我不知道有什么办法使用长整型索引来定位文件,这将是理想的解决scheme。
我该怎么办?
在Windows上,您可以使用_lseeki64()
来执行64位查找。
为了与linux兼容,您也可以在编译时添加-D_FILE_OFFSET_BITS=64
,然后在其中一个头文件中执行此操作:
#ifdef __MINGW32__ // or whatever you use to find out you're compiling on windows #define lseek _lseeki64 #endif
然后像往常一样使用lseek()
。 这是有效的,因为windows忽略_FILE_OFFSET_BITS
标志,而linux不会看到lseek
的重定义。
还有_fseeki64()
如果你喜欢FILE*
版本,并且还有等价的64位tell()
和ftell()
函数( _telli64()
和_ftelli64()
)。
添加编译标志-D_FILE_OFFSET_BITS=64
,这使得fopen
, fseek
, off_t
等变为64位,可用于处理大于2 GB的文件。 有关更多信息,请参阅Linux中的大文件支持 。