2009-06-08 11 views
7

La API de archivos de 64 bits es diferente en cada plataforma.Soporte de archivos grandes en C++

en Windows: _fseeki64
en Linux: fseeko
en FreeBSD: otra llamada similar ...

¿Cómo puedo más eficaz que sea más conveniente y portátil? ¿Hay algún ejemplo útil?

+0

También los tipos son diferentes. Windows usa '__int64' y gcc usa' size-t'. ¿Cuál sería la mejor manera de 'printf' estos? '"% llu ", (unsigned long long) offset'? – hippietrail

+0

@hippietrail: IMO está off_t/off64_t en gcc – rsjethani

Respuesta

13

La mayoría de las plataformas POSIX admiten el símbolo del preprocesador "_FILE_OFFSET_BITS". Establecerlo en hará que el tipo off_t sea de 64 bits en lugar de 32 y las funciones de manipulación de archivos como lseek() admitirán automáticamente el desplazamiento de 64 bits mediante alguna magia de preprocesador. Desde el punto de vista del tiempo de compilación, agregar soporte de compensación de archivos de 64 bits de esta manera es bastante transparente, suponiendo que está utilizando correctamente los tipos de archivos correspondientes. Naturalmente, su ABI cambiará si expone las interfaces que utilizan el tipo off_t. Lo ideal es que definirlo en la línea de comandos, por ejemplo .:

cxx -D_FILE_OFFSET_BITS=64 

para asegurarse de que se aplica a todas las cabeceras del sistema operativo incluidos por su código.

Desafortunadamente, Windows no es compatible con este símbolo del preprocesador, por lo que tendrá que manejarlo usted mismo o confiar en una biblioteca que ofrezca compatibilidad con archivos grandes multiplataforma. ACE es una de esas bibliotecas (ambas basadas en POSIX y plataformas de Windows - simplemente defina _FILE_OFFSET_BITS = 64 en ambos casos). Sé que Boost.filesystem también admite archivos de gran tamaño en plataformas basadas en POSIX, pero no estoy seguro acerca de Windows. Es probable que otras bibliotecas multiplataforma proporcionen soporte similar.

+0

cómo configurar esta bandera desde visual studios 2008? – savi

+0

¿Me pueden ayudar a conseguir esto en Visual Studios? – savi

+0

@savi: No conozco un Visual Studio equivalente a '_FILE_OFFSET_BITS = 64'. Si no está utilizando una biblioteca que maneje de manera transparente los grandes desplazamientos de archivos, probablemente tenga que rodar su propio código para lograr el mismo efecto. Por ejemplo, la discusión "[Acceso de archivo enorme en C] (http://coding.derkeiler.com/Archive/C_CPP/comp.lang.c/2006-12/msg03560.html)" del comp.lang.c grupo de noticias describe un enfoque. – Void

2

Mi mejor sugerencia sería utilizar una biblioteca para manejar esto que ya existe.

Un buen candidato podría estar utilizando la biblioteca de archivos CPL desde GDAL. Esto proporciona soporte de archivos grandes multiplataforma para lectura y escritura, en acceso ascii y binario. La mayoría de los formatos de archivo GDAL se han implementado al usarlo, y son ampliamente utilizados.

0

STLport tienen soporte nativo para 64bits de tamaño de archivo. Por otro lado, si realiza accesos de disco intensivos, es posible que desee utilizar la asignación de archivos: mmap en Unix y CreateFileMapping en Windows.

0

Escribí una biblioteca una vez llamada 'mfile', que significa 'multi-archivo'. El problema era que tenía un sistema que no admitía archivos de gran tamaño, por lo que esta biblioteca usaría el soporte de archivos grandes disponible en algunos sistemas, o manejaría el envío de múltiples archivos que virtualmente sería compatible.

En cualquier caso, proporcionó una interfaz tipo 'ARCHIVO', y funcionó bastante bien. Cuando tuve que hacer un puerto a Windows, fue fácil poner el soporte adecuado de 64 bits. En Unix, _FILE_OFFSET_BITS proporciona suficiente magia que no tuve que jugar demasiados juegos para que funcione.

0

Escriba una clase que encapsule el manejo de archivos y use la compilación condicional en la clase para manejar cada plataforma.

Luego use la clase en lugar del manejo nativo de archivos cuando necesite acceder a un archivo de su programa.

Por lo que puedo decir, no existe un conjunto de funciones de E/S de archivos universalmente portátiles cuando se trata de un manejo de archivos de gran tamaño.