在C中访问大文件

我需要使用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 ,这使得fopenfseekoff_t等变为64位,可用于处理大于2 GB的文件。 有关更多信息,请参阅Linux中的大文件支持 。