Libzippp es un envoltorio C ++ básico simple alrededor de la biblioteca Libzip. Está destinado a ser una biblioteca portátil y fácil de usar para el manejo de cremallera.
La compilación ha sido probada con:
Bibliotecas subyacentes:
Para obtener más información sobre los métodos de compresión disponibles, consulte aquí.
Libzippp se ha portado a VCPKG y, por lo tanto, puede integrarse muy fácilmente ejecutándose:
./vcpkg install libzippp
Esta biblioteca requiere que se compilara al menos C ++ 11.
Linux
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev ).make libraries .Windows:
Todos los sistemas operativos
LIBZIPPP_ENABLE_ENCRYPTION .mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry para agregar CMAKE_BUILD_TYPE si no construye con msvcConfigure y GenerateCMAKE_PREFIX_PATH en los directorios donde los instaló (ya sea a través de -DCMAKE_PREFIX_PATH=<...> o a través de la GUI)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL para instalar. Establezca a través de Commandline como cmake -DNAME=VALUE <other opts> o a través de CMake GUI o CCMake Add Cache Entry .
LIBZIPPP_INSTALL : Instalación de habilitación/desactivación de Libzippp. El valor predeterminado está apagado cuando se usa a través de add_subdirectory , de lo contrarioLIBZIPPP_INSTALL_HEADERS : habilitar/deshabilitar la instalación de encabezados libzippp. El valor predeterminado está apagado cuando se usa a través de add_subdirectory , de lo contrarioLIBZIPPP_BUILD_TESTS : habilitar/deshabilitar las pruebas de construcción de libzippp. El valor predeterminado está apagado cuando se usa a través de add_subdirectory , de lo contrarioLIBZIPPP_ENABLE_ENCRYPTION : habilitar/deshabilitar la construcción de libzippp con capacidades de cifrado. El valor predeterminado está apagado.LIBZIPPP_CMAKE_CONFIG_MODE : habilitar/deshabilitar el edificio con los archivos de configuración CMake instalados de libzip. El valor predeterminado está apagado.LIBZIPPP_GNUINSTALLDIRS : habilitar/deshabilitar el edificio con directorios de instalación tomados de gnuinstallDirs. El valor predeterminado está apagado.CMAKE_INSTALL_PREFIX : dónde instalar el proyecto aCMAKE_BUILD_TYPE : Establecer en la liberación o depuración para construir con o sin optimizacionesCMAKE_PREFIX_PATH : Lista de rutas de prefijo separada por colon (rutas que contienen lib e include carpetas) para las libs instaladas que se utilizarán por estoBUILD_SHARED_LIBS : Establezca en o apagado para construir libs compartidos o estáticos, utiliza la plataforma predeterminada si no se establece Una vez instalado, LibZIPPP se puede usar en cualquier proyecto CMake con facilidad:
Dado que se instaló (a través de CMAKE_INSTALL_PREFIX ) en una ubicación estándar o su prefijo de instalación se pasa a sus proyectos CMAKE_PREFIX_PATH , simplemente puede llamar find_package(libzippp 3.0 REQUIRED) y enlace contra libzippp::libzippp .
Cuando no use CMake para consumir libzippp, debe pasar su directorio de incluido a su compilador y enlace contra libzippp.{a,so} . No olvide también vincularse contra las bibliotecas Libzip, por ejemplo , Lib/libzip-1.11.2/lib/.libs/ ). Un ejemplo de compilación con G ++:
g++ -I./src
-I./lib/libzip-1.11.2/lib I./lib/libzip-1.11.2/build
main.cpp libzippp.a
lib/libzip-1.11.2/lib/.libs/libzip.a
lib/zlib-1.3.1/libz.a Desde la versión 1.5, Libzip utiliza una biblioteca criptográfica subyacente (OpenSSL, Gnutls o Commoncrypto) que es necesaria para la compilación estática. De forma predeterminada, LibzipPP usará -lssl -lcrypto (OpenSSL) como indicadores predeterminados para compilar las pruebas. Esto se puede cambiar usando make CRYPTO_FLAGS="-lsome_lib" LIBZIP_CMAKE="" tests .
Dado que el archivo de Libzip cmake detecta automáticamente la biblioteca criptográfica para usar, de forma predeterminada todas las bibliotecas permitidas, pero OpenSSL se deshabilitan explícitamente en la variable LIBZIP_CMAKE en el makefile.
Vea aquí para obtener más información.
La forma más fácil es descargar fuentes Zlib, Libzip y Libzippp y usar CMake GUI para construir cada biblioteca en orden:
Source puntual a la carpeta fuente de las bibliotecas, Build una nueva carpeta build dentro de ellaGeneratePero también hay un archivo por lotes preparado para ayudar a automatizar esto. Sin embargo, puede necesitar un poco de ajuste.
Asegúrese de tener CMake 3.20 ( CMake.exe debe estar en la ruta) y MS Visual Studio.
Descargue el archivo Libzippp- <Persion> -Windows-Ready_To_Compile.zip de la versión y extraiga en algún lugar de su sistema. Esto creará una estructura preparada, por lo que LibZippP se puede compilar junto con las bibliotecas necesarias.
Compruebe si hay algún parche para aplicar en lib . A veces, algunos archivos no son compilables en C89 en Libzip, dependiendo de la versión.
Simplemente ejecute el archivo compile.bat . Esto compilará Zlib , Libzip y finalmente Libzippp .
Tendrá una carpeta DIST que contiene las carpetas de lanzamiento y depuración donde ahora puede ejecutar las pruebas Libzippp.
Asegúrese de tener CMake 3.10 ( CMake.exe debe estar en la ruta) y MS Visual Studio 2012.
Descargue las fuentes Libzip y Zlib y extravéralas en la carpeta 'lib'. Debe terminar con la siguiente estructura:
libzippp/compile.bat
libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.11.2
Ejecute el compile.bat (simplemente haga doble clic en él). La compilación debe pasar sin error.
Tendrá una carpeta DIST que contiene las carpetas de lanzamiento y depuración donde ahora puede ejecutar las pruebas Libzippp.
Puede usar libzippp.dll y libzippp.lib para vincular dinámicamente la biblioteca o simplemente usar libzippp_static.lib para vincularla estáticamente. A menos que también vincule a Zlib y Libzippp estáticamente, necesitará el DLL empaquetado con su ejecutable.
La API está destinada a ser muy sencilla. Algunas explicaciones francesas se pueden encontrar aquí.
# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::ReadOnly);
vector<ZipEntry> entries = zf. getEntries ();
vector<ZipEntry>::iterator it;
for (it=entries. begin () ; it!=entries. end (); ++it) {
ZipEntry entry = *it;
string name = entry. getName ();
int size = entry. getSize ();
// the length of binaryData will be given by 'size'
void * binaryData = entry. readAsBinary ();
// the length of textData will be given by 'size'
string textData = entry. readAsText ();
// ...
}
zf. close ();
return 0 ;
}También puede crear un archivo directamente desde un búfer
# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
char * buffer = someData;
uint32_t bufferSize = sizeOfBuffer;
ZipArchive* zf = ZipArchive::fromBuffer (buffer, bufferSize);
if (zf!= nullptr ) {
/* work with the ZipArchive instance */
zf-> close ();
delete zf;
}
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::ReadOnly);
// raw access
char * data = ( char *)zf. readEntry ( " myFile.txt " , true );
ZipEntry entry1 = zf. getEntry ( " myFile.txt " );
string str1 (data, entry1. getSize ());
// text access
ZipEntry entry2 = zf. getEntry ( " myFile.txt " );
string str2 = entry2. readAsText ();
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::ReadOnly);
ZipEntry largeEntry = z1. getEntry ( " largeentry " );
std::ofstream ofUnzippedFile ( " largeFileContent.data " );
largeEntry. readContent (ofUnzippedFile);
ofUnzippedFile. close ();
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::Write);
# ifdef LIBZIPPP_USE_BZIP2
// Advanced usage : change the compression method. Default is DEFLATE.
zf. setCompressionMethod (entry, CompressionMethod::BZIP2);
# endif
zf. addEntry ( " folder/subdir/ " );
const char * textData = " Hello,World! " ;
zf. addData ( " helloworld.txt " , textData, 12 );
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. open (ZipArchive::Write);
zf. deleteEntry ( " myFile.txt " );
zf. deleteEntry ( " myDir/subDir/ " );
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
class SimpleProgressListener : public ZipProgressListener {
public:
SimpleProgressListener ( void ) {}
virtual ~SimpleProgressListener ( void ) {}
void progression ( double p) {
cout << " -- Progression: " << p << endl;
}
};
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
/* add/modify/delete entries in the archive */
// register the listener
SimpleProgressListener spl;
zf. addProgressListener (&spl);
// adjust how often the listener will be invoked
zf. setProgressPrecision ( 0.1 );
// listener will be invoked
zf. close ();
return 0 ;
}# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
// important to use calloc/malloc for the fromWritableBuffer !
void * buffer = calloc ( 4096 , sizeof ( char ));
ZipArchive* z1 = ZipArchive::fromWritableBuffer (&buffer, 4096 , ZipArchive::New);
/* add content to the archive */
// updates the content of the buffer
z1-> close ();
// length of the buffer content
int bufferContentLength = z1-> getBufferLength ();
ZipArchive::free (z1);
// read again from the archive:
ZipArchive* z2 = ZipArchive::fromBuffer (buffer, bufferContentLength);
/* read the archive - no modification allowed */
ZipArchive::free (z2);
// read again from the archive, for modification:
ZipArchive* z3 = ZipArchive::fromWritableBuffer (&buffer, bufferContentLength);
/* read/write the archive */
ZipArchive::free (z3);
free (buffer);
return 0 ;
} Por defecto, el manejo de errores es bastante básico y los detalles de los errores se arrojan a stderr . Sin embargo, es posible proporcionar un método de devolución de llamada para anular este comportamiento. Si se requiere algún contexto, puede usar std::bind o lambda-funciones.
# include " libzippp.h "
using namespace libzippp ;
int main ( int argc, char ** argv) {
ZipArchive zf ( " archive.zip " );
zf. setErrorHandlerCallback ([]( const std::string& message,
const std::string& strerror ,
int zip_error_code,
int system_error_code)
{
// Handle error here
fprintf (stderr, message. c_str (), strerror . c_str ());
});
zf. open (ZipArchive::Write);
zf. addEntry ( " folder/subdir/ " );
const char * textData = " Hello,World! " ;
zf. addData ( " helloworld.txt " , textData, 12 );
zf. close ();
return 0 ;
}Es posible que ya tenga Libzip compilado en otra parte de su sistema. Por lo tanto, no necesitas ejecutar 'hacer libzip'. En su lugar, simplemente coloque la ubicación de Libzip cuando compile Libzippp:
make LIBZIP=path/to/libzip Bajo Debian, tendrá que instalar el paquete zlib1g-dev para compilar si no desea instalar ZLIB manualmente.
Por defecto, MS Visual Studio 2012 se instala en la siguiente ruta:
C:Program Files (x86)Microsoft Visual Studio 11.0
Tenga en cuenta que las clases no virtuales solo se comparten dentro de la DLL de Libzippp. Por lo tanto, necesitará usar el mismo compilador para Libzippp y las piezas de código que lo usen. Para evitar este problema, tendrá que vincular la biblioteca estáticamente.
Más información aquí.
Se pueden encontrar explicaciones adicionales aquí.
Este proyecto está completamente desarrollado durante mi tiempo libre.
Como soy un gran admirador de las criptomonedas y especialmente Cardano (ADA), puede enviarme algunas monedas en la dirección a continuación (revisándolo aquí):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66