2010-12-01 9 views
5

Tengo un montón de archivos pequeños que debo enviar con una aplicación que compilo y quiero poner estos archivos en un archivo para facilitar más la copia y la redistribución. También me gusta la idea de tenerlos todos en un solo lugar, así que tengo que comparar el md5 de un archivo solo en caso de que algo salga mal.Contenedor de archivos C++ (por ejemplo, zip) para facilitar el acceso

Estoy pensando en una clase que pueda cargar el archivo y devolver una lista de archivos dentro del archivo y cargar un archivo en la memoria si necesito acceder a él.

Ya busqué en Internet diferentes métodos para lograr lo que quiero y descubrí zlib y lzma sdk. Ambos realmente no me atraían porque realmente no descubrí lo portátil que es zlib y no me gustó el lzma SDK ya que es demasiado y no quiero explotar la aplicación debido a esto problema. Otro inconveniente de zlib es que no tengo la experiencia C/C++ (soy realmente nuevo en C++) para obtener todo lo explicado en el manual.

También tengo que agregar que este es un problema de tiempo crítico. Pensé en implementar un formato simple como tar de una manera que me permitiera acceder fácilmente a los archivos de mi aplicación, pero no encontré tiempo para hacerlo.

Lo que estoy buscando es una biblioteca que me permite acceder a los archivos dentro de un archivo. Me gustaría que alguien me señale la dirección correcta aquí.

Gracias de antemano, Robin.

Editar: Necesito que se acceda al archivo en Linux y Windows. Perdón, no lo mencioné al principio.

Respuesta

2

La respuesta depende de si planea modificar el archivo mediante código una vez que el archivo se haya creado inicialmente.

Si no necesita modificarlo, puede utilizar TAR, es un formato práctico y simple. Si desea compresión, puede implementar el lector tar.gz o encontrar alguna biblioteca que lo haga (creo que hay algunos disponibles, incluidos los de código abierto).

Si su aplicación necesita acceso aleatorio a los datos o si necesita modificar el archivo, entonces los archivos regulares TAR o ZIP no son buenos. El sistema de archivos virtual, como nuestro SolFS o el sistema de archivos CodeBase, se ajustará mucho mejor: los sistemas de archivos virtuales son adecuados para modificaciones frecuentes del almacenamiento, mientras que los archivos se dirigen principalmente a escenarios de escritura, una vez leídos, muchos usos.

+2

Bueno, Zip sería suficiente, pero no analicé el término VFS en absoluto. Encontré PhysicsFS y creo que eso es exactamente lo que usaré para mi proyecto. Muchas gracias por su respuesta. – Robin

2

zlib es muy portátil y muy utilizado. si no puede encontrarle sentido a la interfaz C++, existen alternativas para muchos otros idiomas; consulte 'Enlaces externos relacionados' here.

Eche un vistazo antes de buscar algo diferente.

+1

Pero 'zlib' no hace lo que el OP quiere que esté archivando. Hace compresión, pero no puede entender el formato de archivo .zip por sí mismo. –

+0

Sí, la compresión solo es necesaria en el segundo momento, lo que más necesito es agrupar los cientos de archivos pequeños en un solo archivo. – Robin

2

Si está utilizando Qt o Windows también puede empacar datos en el área de recursos del ejecutable. Solo tendrías que distribuir el archivo ejecutable usando esta técnica. Hay una API bien definida ya escrita y probada para acceder a esa información.

3

Para comprimir, siempre he sido parcial con ZipUtils, lo que facilita el proceso y está construido sobre las bibliotecas zlib e info-zip.

+0

Gracias por el enlace amigo, pero necesito que se ejecute en Windows y Linux. ZipUtils solo funciona en Windows. – Robin

+0

@Robin: ¿Puedes poner eso en tu pregunta, por favor? :) ¡Gracias! –

0

La API zlib es el camino a seguir. Simple y portátil. Lookat unzip.h encabezado para las API que acceden a archivos de almacenamiento. Está en C y es muy fácil.

Si los archivos son pequeños, puede volcarlos en literales de cadenas (buscar la utilidad bin2h) e incluirlos en su proyecto. Luego cambie el código que lee los archivos. Si todos los archivos se leen actualmente utilizando la clase ifstream, simplemente cambiándolo a la clase istringstream y recompile el código.

0

Intente usar Quazip - es bastante simple de usar. Puede usarlo como una secuencia desde la que lee el archivo comprimido sobre la marcha.

+0

Gracias por la sugerencia, pero no me gustaría hinchar una aplicación de consola con dependencias qt. – Robin

Cuestiones relacionadas