Hola a todos:
Necesito unas librerías de descompresión (de zip por ejemplo) pero que funcionen en linux y windows. Creo que de las mas conocidas es:
http://www.gzip.org/zlib/He estado mirando pero no me entero muy bien como funciona. ¿sabéis de algún ejemplo sencillo de utilizar para comprimir y descomprimir en c++?
A lo mejor hay otra libreria mas sencilla
Gracias y un saludo
Te pasteo algo de mi codigo porsi te sirve:
bool cEvilExport::AddBuffer(void *buffer, unsigned size, const char *fileName, zipFile zFile)
{
if (buffer == NULL || !size)
return Error("(!) '%s' sin datos, ignorandolo", fileName);
if (zFile)
{
int err;
zip_fileinfo zi;
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;
filetime((char*)fileName, &zi.tmz_date, &zi.dosDate);
if (m_nOptionEncrypt && !m_strPassword.empty())
{
uLong crc = crc32(crc32(0L, Z_NULL, 0), (const Bytef *)buffer, size);
err = zipOpenNewFileInZip3(zFile, fileName, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_BEST_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, m_strPassword.c_str(), crc);
}
else
err = zipOpenNewFileInZip(zFile, fileName, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_BEST_COMPRESSION);
if (err == ZIP_OK)
{
err = zipWriteInFileInZip(zFile, buffer, size);
if (err < 0)
return Error("(!) Error al escribir \"%s\", ignorandolo", fileName);
}
else
return Error("(!) Error al insertar \"%s\", ignorandolo", fileName);
zipCloseFileInZip(zFile);
}
else
{
...
}
return true;
}
eso seria para comprimir, para descomprimir:
iFile *cFileSystemWIN32::Open(const std::string &strFileName, const std::string &strOptions)
{
assert(!strFileName.empty());
//char tempPathID[MAX_PATH];
//ParsePathID(pFileName, pathID, tempPathID);
int hFile;
cFileWIN32 *newFile;
if ((hFile = _open(strFileName.c_str(), _O_BINARY | _O_RDONLY)) != -1)
{
...
}
else // Buscamos en los comprimidos
{
unzFile zipFile;
for (std::map<std::string, std::set<std::string> >::const_iterator it = m_mapFiles.begin(); it != m_mapFiles.end(); ++it)
{
if (it->second.find(strFileName) == it->second.end())
continue;
if ((zipFile = unzOpen(it->first.c_str())) != NULL)
{
if (unzLocateFile(zipFile, strFileName.c_str(), 0) == UNZ_OK)
{
unz_file_info fileInfo;
unzGetCurrentFileInfo(zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (fileInfo.uncompressed_size == 0)
TRACE(LVL_ERROR, "[iFileSystem] '%s' in '%s' is empty", strFileName.c_str(), it->first.c_str());
if (unzOpenCurrentFile(zipFile) == UNZ_OK)
{
int nError;
newFile = new cFileWIN32(fileInfo.uncompressed_size);
nError = unzReadCurrentFile(zipFile, newFile->m_pMemory, fileInfo.uncompressed_size);
if (nError < 0)
TRACE(LVL_ERROR, "[iFileSystem] Uncompress error at '%s' in '%s' (%d)", strFileName.c_str(), it->first.c_str(), nError);
unzCloseCurrentFile(zipFile);
unzClose(zipFile);
return newFile;
}
else
TRACE(LVL_ERROR, "[iFileSystem] cant open '%s' in '%s'", strFileName.c_str(), it->first.c_str());
}
}
else
TRACE(LVL_ERROR, "[iFileSystem] '%s' in '%s' corrupt", strFileName.c_str(), it->first.c_str());
}
}
TRACE(LVL_WARNING, "[iFileSystem] '%s' not found", strFileName.c_str());
return NULL;
}
Hechale un ojo tambien a
http://www.7-zip.org/ que es, creo, mejor que la zlib.
Te agradezco que me pases el código pero la verdad no entiendo como lo haces. Supongo que lo estas haciendo con "zlib" ¿no?. Voy a mirarme el manual de zlib bien antes de seguir con tu código a ver si eso me saca de dudas.
¿hay algún tuto es español para usar zlib en c++?
gracias
http://www.unrarlib.orgLa mejor librería de descompresión que conozco, tanto por el formato como por la facilidad de uso.
zlib está bien, la uso igualmente, pero requiere que te hagas con una pequeña capa por encima de alto nivel para poder manejar los ficheros.
Nadie tiene o sabe de algún código que lea un archivo ZIP con Zlib??
Os lo agradecería mucho pq no consigo que me funcione y no lo entiendo bien
He visto las librerías RAR y la verdad que son la caña de sencillas. La cuestión es que me gustaría que fuesen las Zlib ya que quiero compilar el juego que estoy haciendo también en la GP32 y se que las Zlib funcionan bien ahí.
Muchas gracias por todo
Javiel, si no tienes la necesidad de que lean .zip... existen otras librerias que son bastante sencillas y orientadas a las descompresion en tiempo real (no llegan a comprimir tanto como zlib pero si quieres maxima compresion tienes que usar las bzip2).
Bueno, q me voy por las ramas, a lo que iba, prueba las UCL que las encontraras aqui:
http://www.oberhumer.com/opensource/ucl/son portables, sencillas de usar, comprimen a gran velocidad y son rapidisimas descomprimiendo. Para comprimir, con 1 funcion lo haras y para descomprimir igual... mas faciles imposibles :P . Si tienes algun problema utilizandolas o lo que sea, dime algo vale?
un saludo
Cita de: "javiel"Nadie tiene o sabe de algún código que lea un archivo ZIP con Zlib??
Os lo agradecería mucho pq no consigo que me funcione y no lo entiendo bien
He visto las librerías RAR y la verdad que son la caña de sencillas. La cuestión es que me gustaría que fuesen las Zlib ya que quiero compilar el juego que estoy haciendo también en la GP32 y se que las Zlib funcionan bien ahí.
Muchas gracias por todo
Creo que hay un error de concepto..
La libreria ZLib en sí misma, sólo provee de mecanismos para comprimir/descomprimir datos. No tiene nada que ver con el formato de fichero utilizado para distribuir los datos*
Por ejemplo, los formatos .Zip o .Gzip usan el algoritmo de compresión implementado en ZLib. Yo en su día me hice un formato de fichero propio, pero comprimía usando ZLib.
Tu necesitas una libreria que maneje ficheros .Zip. Lo más normal es que esté basada en ZLib.
* Nota: ZLib sí incluye varias funciones de nivel superior para tratar ficheros comprimidos, pero en formato .gzip(en Linux es cómodo manejarlos, pero en Windows tienes q rebuscar alguna GUI)
Gracias me va quedando mas claro.
Veo que la que dice TheAzazel está bastante bien. La he instalado y funciona perfecto. Lo que no encuentro es nada de documentacion en la página de como utilizarla. He visto los dos ejemplos que vienen, pero me entero de poco la verdad. Dices que simplemente con 1 funcion puedo comprimir y descomprimir ¿tienes algun codigo que haga eso?
Me gustaría implementar un código que con esa librería sacara un archivo concreto de un archivo comprimido en ZIP. Por ejemplo, tengo 1 archivo zip llamado "archivos.zip" y dentro un montón de imágenes. Lo que necesito es una funcion que le pase el archivo zip y el nombre de una de las imagenes de dentro y me las saque
Graicas por todo y por la explicación de ZaelSiuS
Uhm....
si quieres abrir un .zip para descomprimir un fichero... UCL no te servira ya que no es el mismo formato de compresion...
si quieres hacer eso, tienes q hacer caso de lo que te han dicho los demas.... en concreto zaelsius.... y utilizar zlib para acceder al .zip, un saludo
la
zziplib maneja de forma mas extendida los ficheros zip
una cosa, zlib maneja ficheros zip tmb es un poco oscuro enrrealidad, pero funciona bastante bien, recuerdo haber visto en la documentacion esas cosas y en los ejemplos
suerte
Hace un tiempo javier Arevalo publicó en el COTD de flipcode.com (.com!) un código para hacer exactamente lo que tú quieres. Supongo que estará tb en su página personal.
También me suena que la gente usaba el cargador de zip's de un emulador conocido, no sé cual .. :)
saludos
Las librerías ZZIP son exactamente lo que estaba buscando. Además y por casualidad he encotrado esta web:
http://www.kekkai.org/roger/sdl/rwops/rwops.htmlque explica exactamente lo que yo quiero hacer en SDL.
Gracias a todos por vuestra ayuda
Ya que estamos en el tema...
alguien em puede explicar por qué el visual studio me marca error de sintaxys al intentar compilar las zziplib ?
es la versión 0.13.38 y por más que le he buscado, no sale de donde mismo.
me marca 6 errores de sintaxys en 2 líneas (3 en cada linea) en el archivo fetch.h:
/* get 16/32 bits from little-endian zip-file to host byteorder */
extern uint32_t __zzip_get32(unsigned char * s) __attribute__((const));
extern uint16_t __zzip_get16(unsigned char * s) __attribute__((const));
estoy usando el proyecto de vc7 que viene junto con los fuentes y tratando de compilar la configuración "release".
Los errores me los marca en el __attribute, en el ; y otro dice algo de "tipo"
a mi tambien me daba esos errores, alfinal tuve que usar zlib solamente