Libzippp est un simple wrapper C ++ de base autour de la bibliothèque Libzip. Il est destiné à être une bibliothèque portable et facile à utiliser pour la manipulation du zip.
La compilation a été testée avec:
Bibliothèques sous-jacentes:
Pour plus d'informations sur les méthodes de compression disponibles, consultez ici.
Libzippp a été porté vers VCPKG et peut donc être très facilement intégré par l'exécution:
./vcpkg install libzippp
Cette bibliothèque nécessite au moins C ++ 11 pour être compilée.
Linux
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev ).make libraries .Windows:
Tous les systèmes d'exploitation
LIBZIPPP_ENABLE_ENCRYPTION .mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry pour ajouter CMAKE_BUILD_TYPE si ce n'est pas la construction avec MSVCConfigure et GenerateCMAKE_PREFIX_PATH aux répertoires où vous les avez installés (via -DCMAKE_PREFIX_PATH=<...> ou via l'interface graphique)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL à installer. Définissez via CommandLine en tant que cmake -DNAME=VALUE <other opts> ou via Cmake GUI ou CCmake Add Cache Entry .
LIBZIPPP_INSTALL : activer / désactiver l'installation de libzippp. La valeur par défaut est désactivée lors de l'utilisation via add_subdirectory , sinonLIBZIPPP_INSTALL_HEADERS : activer / désactiver l'installation des en-têtes libzippp. La valeur par défaut est désactivée lors de l'utilisation via add_subdirectory , sinonLIBZIPPP_BUILD_TESTS : activer / désactiver les tests libzippp. La valeur par défaut est désactivée lors de l'utilisation via add_subdirectory , sinonLIBZIPPP_ENABLE_ENCRYPTION : activer / désactiver la construction libzippp avec des capacités de chiffrement. La valeur par défaut est désactivée.LIBZIPPP_CMAKE_CONFIG_MODE : Activer / désactiver la construction avec les fichiers de configuration cmake installés libzip. La valeur par défaut est désactivée.LIBZIPPP_GNUINSTALLDIRS : Activer / désactiver la construction avec des répertoires d'installation tirés de GnuinstallDirs. La valeur par défaut est désactivée.CMAKE_INSTALL_PREFIX : où installer le projet pourCMAKE_BUILD_TYPE : réglé pour libérer ou déboguer pour construire avec ou sans optimisationsCMAKE_PREFIX_PATH : Liste des chemins de préfixe séparés par le colon (chemins contenant lib et include des dossiers) pour les libs installés à utiliser par ceBUILD_SHARED_LIBS : réglé sur ou désactiver pour construire des libs partagés ou statiques, utilise la plate-forme par défaut si elle n'est pas définie Une fois installé, libzippp peut être utilisé à partir de n'importe quel projet CMake avec facilité:
Étant donné qu'il a été installé (via CMAKE_INSTALL_PREFIX ) dans un emplacement standard ou son préfixe d'installation est transmis dans vos projets CMAKE_PREFIX_PATH vous pouvez simplement appeler find_package(libzippp 3.0 REQUIRED) et lier à libzippp::libzippp .
Lorsque vous n'utilisez pas CMake pour consommer Libzippp, vous devez transmettre son répertoire inclue à votre compilateur et un lien contre libzippp.{a,so} . N'oubliez pas de créer également un lien avec les bibliothèques libzip, par exemple dans lib / libzip-1.11.2 / lib / .libs / ). Un exemple de compilation avec 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 Depuis la version 1.5, Libzip utilise une bibliothèque cryptographique sous-jacente (OpenSSL, GNUTLS ou CommonCrypto) qui est nécessaire pour la compilation statique. Par défaut, Libzippp utilisera -lssl -lcrypto (OpenSSL) comme indicateurs par défaut pour compiler les tests. Cela peut être modifié en utilisant make CRYPTO_FLAGS="-lsome_lib" LIBZIP_CMAKE="" tests .
Étant donné que le fichier de Libzip cmake détecte automatiquement la bibliothèque cryptographique à utiliser, par défaut, toutes les bibliothèques autorisées mais OpenSSL sont explicitement désactivées dans la variable LIBZIP_CMAKE dans le makefile.
Voir ici pour plus d'informations.
Le moyen le plus simple est de télécharger des sources de Zlib, Libzip et Libzippp et d'utiliser Cmake GUI pour créer chaque bibliothèque dans l'ordre:
Source dans le dossier Source Libraries, Build vers une nouvelle build de dossiers à l'intérieurGenerateMais il y a aussi un fichier de lots préparé pour aider à automatiser cela. Il peut cependant nécessiter un certain ajustement.
Assurez-vous d'avoir Cmake 3.20 ( cmake.exe doit être dans le chemin) et MS Visual Studio.
Téléchargez le fichier libzippp- <version> -windows-ready_to_compile.zip à partir de la version et extraire quelque part sur votre système. Cela créera une structure préparée, donc Libzippp peut être compilé avec les bibliothèques nécessaires.
Vérifiez s'il y a un correctif à appliquer dans la lib . Parfois, certains fichiers ne sont pas compilables en C89 dans Libzip, selon la version.
Exécutez simplement le fichier compile.bat . Cela compilera Zlib , Libzip et enfin Libzippp .
Vous aurez un dossier DIST contenant les dossiers de version et de débogage où vous pouvez désormais exécuter les tests Libzippp.
Assurez-vous d'avoir Cmake 3.10 ( cmake.exe doit être dans le chemin) et MS Visual Studio 2012.
Téléchargez les sources Libzip et Zlib et extraire-les dans le dossier «lib». Vous devriez vous retrouver avec la structure suivante:
libzippp/compile.bat
libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.11.2
Exécutez le compilé.bat (double-cliquez simplement dessus). La compilation doit aller sans erreur.
Vous aurez un dossier DIST contenant les dossiers de version et de débogage où vous pouvez désormais exécuter les tests Libzippp.
Vous pouvez utiliser libzippp.dll et libzippp.lib pour lier dynamiquement la bibliothèque ou simplement utiliser libzippp_static.lib pour le lier statiquement. Sauf si vous liez également ZLIB et Libzippp statiquement, vous aurez besoin de la DLL emballée avec votre exécutable.
L'API est censée être très simple. Certaines explications françaises peuvent être trouvées ici.
# 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 ;
}Vous pouvez également créer une archive directement à partir d'un tampon
# 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 ;
} Par défaut, la gestion des erreurs est assez basique et les détails des erreurs sont jetés sur stderr . Cependant, il est possible de fournir une méthode de rappel pour remplacer ce comportement. Si un contexte est requis, vous pouvez utiliser std::bind ou Lambda-fonctions.
# 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 ;
}Vous avez peut-être déjà compilé libzip ailleurs sur votre système. Par conséquent, vous n'avez pas besoin d'exécuter «faire libzip». Au lieu de cela, placez simplement l'emplacement de Libzip lorsque vous compilez Libzippp:
make LIBZIP=path/to/libzip Sous Debian, vous devrez installer le package zlib1g-dev afin de compiler si vous ne souhaitez pas installer ZLIB manuellement.
Par défaut, MS Visual Studio 2012 est installé sous le chemin suivant:
C:Program Files (x86)Microsoft Visual Studio 11.0
Sachez que les classes non virtuelles sont partagées dans la DLL de Libzippp. Par conséquent, vous devrez utiliser le même compilateur pour Libzippp et les pièces de code qui l'utiliseront. Pour éviter ce problème, vous devrez relier la bibliothèque statiquement.
Plus d'informations ici.
Des explications supplémentaires peuvent être trouvées ici.
Ce projet est complètement développé pendant mon temps libre.
Puisque je suis un grand fan des crypto-monnaies et surtout Cardano (ADA), vous pouvez m'envoyer des pièces à l'adresse ci-dessous (vérifiez-la ici):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66