C ++中的大文件支持

时间:2009-06-08 16:18:09

标签: c++ c 64-bit cross-platform large-files

每个平台上的64位文件API都不同。

在Windows中

_fseeki64
在linux中:fseeko
在freebsd:另一个类似的电话......

如何才能最有效地使其更方便和便携?有没有有用的例子?

5 个答案:

答案 0 :(得分:14)

大多数基于POSIX的平台都支持“ _FILE_OFFSET_BITS ”预处理器符号。将其设置为 64 将导致 off_t 类型为64位而不是32位,并且 lseek()等文件操作函数将自动支持64位偏移通过一些预处理器魔术。从编译时的角度来看,假设您正确使用相关的typedef,以这种方式添加64位文件偏移支持是相当透明的。当然,如果您暴露使用 off_t 类型的界面,您的ABI将会改变。理想情况下,您应该在命令行中定义它,例如:

cxx -D_FILE_OFFSET_BITS=64

确保它适用于代码中包含的所有操作系统头文件。

不幸的是,Windows不支持此预处理程序符号,因此您必须自己处理它,或者依赖提供跨平台大文件支持的库。 ACE就是这样一个库(基于POSIX和Windows平台 - 在两种情况下都只定义 _FILE_OFFSET_BITS = 64 )。我知道Boost.filesystem也支持基于POSIX的平台上的大文件,但我不确定Windows。其他跨平台库可能提供类似的支持。

答案 1 :(得分:2)

我最好的建议是使用库来处理已经存在的库。

一个好的候选人可能正在使用GDAL中的CPL文件库。这为ascii和二进制访问提供了对read + write的跨平台大文件支持。大多数GDAL文件格式都是使用它实现的,并且被广泛使用。

答案 2 :(得分:0)

STLport原生支持64位文件大小。另一方面,如果您正在进行密集的磁盘访问,则可能需要在unix上使用文件映射:mmap,在Windows上使用CreateFileMapping

答案 3 :(得分:0)

我写了一个名为'mfile'的库,它代表'多文件'。问题是我有一个不支持大文件的系统,所以这个库要么使用某些系统上可用的大文件支持,要么处理传递它将虚拟连接的多个文件。

无论如何,它提供了一个类似“FILE”的界面,并且工作得很好。当我不得不移植到Windows时,很容易提供适当的64位支持。在Unix上,_FILE_OFFSET_BITS提供了足够的魔力,我没有必要玩太多游戏才能工作。

答案 4 :(得分:0)

编写一个封装文件处理的类,并在类中使用条件编译来处理每个平台。

当您需要从程序中访问文件时,只需使用类而不是本机文件处理。

据我所知,当文件处理量很大时,没有一套普遍可移植的文件I / O函数。