libzippp ist eine einfache C ++ - Wrapper um die Libzip -Bibliothek. Es soll eine tragbare und benutzerfreundliche Bibliothek für die Behandlung mit Zip-Handhabung sein.
Die Zusammenstellung wurde getestet mit:
Zugrunde liegende Bibliotheken:
Weitere Informationen zu verfügbaren Komprimierungsmethoden finden Sie hier.
libzippp wurde auf vcpkg portiert und kann daher durch Ausführen sehr leicht integriert werden:
./vcpkg install libzippp
Diese Bibliothek erfordert, dass mindestens C ++ 11 kompiliert werden.
Linux
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev ).make libraries zu verwenden.Fenster:
Alle Betriebssysteme
LIBZIPPP_ENABLE_ENCRYPTION aktiviert werden.mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry um CMAKE_BUILD_TYPE hinzuzufügen, wenn Sie nicht mit MSVC erstellenConfigure und GenerateCMAKE_PREFIX_PATH auf die Verzeichnisse einstellen, in denen Sie diese installiert haben (entweder über -DCMAKE_PREFIX_PATH=<...> oder über die GUI).-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL . Setzen Sie über Befehlszeile als cmake -DNAME=VALUE <other opts> oder über CMake -GUI oder CCMake Add Cache Entry .
LIBZIPPP_INSTALL : Aktivierung von libzippp aktivieren/deaktivieren. Die Standardeinstellung ist ausgeschaltet, wenn Sie über add_subdirectory verwendet werden, sonst aufLIBZIPPP_INSTALL_HEADERS : Aktivierung von Libzippp -Headern aktivieren/deaktivieren. Die Standardeinstellung ist ausgeschaltet, wenn Sie über add_subdirectory verwendet werden, sonst aufLIBZIPPP_BUILD_TESTS : Aktivieren/Deaktivieren von Bauen libzippp -Tests aktivieren/deaktivieren. Die Standardeinstellung ist ausgeschaltet, wenn Sie über add_subdirectory verwendet werden, sonst aufLIBZIPPP_ENABLE_ENCRYPTION : Aktivieren/Deaktivieren von Libzippp mit Verschlüsselungsfunktionen aktivieren/deaktivieren. Standard ist aus.LIBZIPPP_CMAKE_CONFIG_MODE : Aktivieren/Deaktivieren Sie das Erstellen mit libzip installierten cmake config -Dateien. Standard ist aus.LIBZIPPP_GNUINSTALLDIRS : Aktivieren/deaktivieren Sie das Gebäude mit Installationsverzeichnissen aus Gnuinstalldirs. Standard ist aus.CMAKE_INSTALL_PREFIX : Wo das Projekt zu installieren istCMAKE_BUILD_TYPE : SetzenCMAKE_PREFIX_PATH : DOMin-getrennte Liste von Präfixpfaden (Pfade, die lib und Ordner include ) für installierte LIBs, die von diesem verwendet werden sollenBUILD_SHARED_LIBS : Setzen Sie auf ein oder aus, um gemeinsam genutzte oder statische Libs zu erstellen, und verwenden Sie die Plattform Standard, falls festgelegt wird Nach der Installation von libzippp kann mühelos von jedem CMAKE -Projekt verwendet werden:
Angesichts der Tatsache find_package(libzippp 3.0 REQUIRED) dass es (über CMAKE_INSTALL_PREFIX libzippp::libzippp in einen Standardstandort installiert wurde oder das Installationspräfix in Ihre Projekte übergeben wurde CMAKE_PREFIX_PATH
Wenn Sie CMake nicht verwenden, um libzippp zu konsumieren, müssen Sie sein Verzeichnis an Ihren Compiler übergeben und gegen libzippp.{a,so} . Vergessen Sie nicht, auch mit libzip-Bibliotheken, z. B. in libzip-1.11.2/lib/.libs/ ) zu verlinken. Ein Beispiel für die Zusammenstellung mit 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 Seit Version 1.5 verwendet Libzip eine zugrunde liegende kryptografische Bibliothek (OpenSSL, GNUTLS oder Commoncrypto), die für die statische Zusammenstellung erforderlich ist. Standardmäßig verwendet Libzippp -lssl -lcrypto (OpenSSL) als Standardflags, um die Tests zu kompilieren. Dies kann durch Verwendung make CRYPTO_FLAGS="-lsome_lib" LIBZIP_CMAKE="" tests geändert werden.
Da die Datei von Libzip cmake die zu verwendende kryptografische Bibliothek automatisch erkennt, sind standardmäßig alle erlaubten Bibliotheken in der Variablen LIBZIP_CMAKE im makefile explizit deaktiviert.
Weitere Informationen finden Sie hier.
Am einfachsten ist es, ZLIB-, Libzip- und Libzippp -Quellen herunterzuladen und CMAKE -GUI zu verwenden, um jede Bibliothek in der Reihenfolge zu erstellen:
Source auf den Quellordner der Bibliotheken und Build in einem neuen build darinGenerateEs gibt aber auch eine vorbereitete Stapeldatei, um diese zu automatisieren. Möglicherweise muss jedoch etwas angepasst werden.
Stellen Sie sicher, dass Sie CMake 3.20 ( CMake.exe im Pfad) und MS Visual Studio haben.
Laden Sie die libzippp- <version> -Windows-rady_to_compile.zip- Datei aus der Veröffentlichung herunter und extrahieren Sie sie irgendwo in Ihrem System. Dies erzeugt eine vorbereitete Struktur, sodass Libzippp zusammen mit den benötigten Bibliotheken zusammengestellt werden kann.
Überprüfen Sie, ob in LIB ein Patch für Sie angewendet werden kann. Manchmal sind einige Dateien in C89 in Libzip nicht kompiliert, abhängig von der Version.
Führen Sie einfach die Datei compile.bat aus. Dies wird Zlib , Libzip und schließlich Libzippp zusammenstellen.
Sie haben einen DIST -Ordner mit den Release- und Debugg -Ordnern, in denen Sie jetzt die Libzippp -Tests durchführen können.
Stellen Sie sicher, dass Sie CMake 3.10 ( CMake.exe im Pfad) und MS Visual Studio 2012 haben.
Laden Sie Libzip- und ZLIB -Quellen herunter und extrahieren Sie sie im Ordner "lib". Sie sollten die folgende Struktur haben:
libzippp/compile.bat
libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.11.2
Führen Sie das Compile.bat aus (Doppelklicken Sie einfach darauf). Die Zusammenstellung sollte ohne Fehler geraten.
Sie haben einen DIST -Ordner mit den Release- und Debugg -Ordnern, in denen Sie jetzt die Libzippp -Tests durchführen können.
Sie können entweder libzippp.dll und libzippp.lib verwenden, um die Bibliothek dynamisch zu verknüpfen oder einfach libzippp_static.lib zu verwenden, um sie statisch zu verknüpfen. Wenn Sie nicht auch ZLIB und Libzippp statisch verknüpfen, benötigen Sie die DLL mit Ihrer ausführbaren Datei.
Die API soll sehr einfach sein. Einige französische Erklärungen finden Sie hier.
# 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 ;
}Sie können auch ein Archiv direkt aus einem Puffer erstellen
# 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 ;
} Standardmäßig ist die Fehlerbehandlung ziemlich einfach und die Fehlerdetails werden in stderr abgelegt. Es ist jedoch möglich, eine Rückrufmethode zur Übergabe dieses Verhaltens bereitzustellen. Wenn ein Kontext erforderlich ist, können Sie std::bind oder Lambda-Funktionen verwenden.
# 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 ;
}Möglicherweise haben Sie bereits Libzip an anderer Stelle in Ihrem System zusammengestellt. Daher müssen Sie nicht "Make libzip" laufen lassen. Setzen Sie stattdessen einfach den Libzip -Standort ein, wenn Sie Libzippp zusammenstellen:
make LIBZIP=path/to/libzip Unter Debian müssen Sie das Paket zlib1g-dev installieren, um zu kompilieren, wenn Sie ZLIB nicht manuell installieren möchten.
Standardmäßig ist MS Visual Studio 2012 unter dem folgenden Pfad installiert:
C:Program Files (x86)Microsoft Visual Studio 11.0
Beachten Sie, dass nicht virtuelle Klassen innerhalb der DLL von libzippp geteilt werden. Daher müssen Sie denselben Compiler für libzippp und die Codestücke verwenden, die ihn verwenden. Um dieses Problem zu vermeiden, müssen Sie die Bibliothek statisch verknüpfen.
Weitere Informationen hier.
Hier finden Sie zusätzliche Erklärungen.
Dieses Projekt ist während meiner Freizeit vollständig entwickelt.
Da ich ein großer Fan von Kryptowährungen und insbesondere Cardano (ADA) bin, können Sie mir einige Münzen unter der folgenden Adresse senden (überprüfen Sie es hier):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66