Libzippp adalah pembungkus C ++ dasar sederhana di sekitar pustaka Libzip. Ini dimaksudkan untuk menjadi perpustakaan portabel dan mudah digunakan untuk penanganan zip.
Kompilasi telah diuji dengan:
Perpustakaan yang mendasari:
Untuk info lebih lanjut tentang metode kompresi yang tersedia, lihat di sini.
libzippp telah diangkut ke VCPKG dan dengan demikian dapat sangat mudah diintegrasikan dengan menjalankan:
./vcpkg install libzippp
Perpustakaan ini membutuhkan setidaknya C ++ 11 untuk dikompilasi.
Linux
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev ).make libraries .Windows:
Semua sistem operasi
LIBZIPPP_ENABLE_ENCRYPTION .mkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry Untuk menambahkan CMAKE_BUILD_TYPE jika tidak membangun dengan msvcConfigure & GenerateCMAKE_PREFIX_PATH ke direktori tempat Anda menginstalnya (baik melalui -DCMAKE_PREFIX_PATH=<...> atau melalui gui)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL untuk menginstal. Setel melalui CommandLine sebagai cmake -DNAME=VALUE <other opts> atau melalui cmake gUI atau ccmake Add Cache Entry .
LIBZIPPP_INSTALL : Aktifkan/nonaktifkan pemasangan libzippp. Default tidak aktif saat menggunakan via add_subdirectory , selain ituLIBZIPPP_INSTALL_HEADERS : Aktifkan/nonaktifkan pemasangan header libzippp. Default tidak aktif saat menggunakan via add_subdirectory , selain ituLIBZIPPP_BUILD_TESTS : mengaktifkan/menonaktifkan tes bangunan libzippp. Default tidak aktif saat menggunakan via add_subdirectory , selain ituLIBZIPPP_ENABLE_ENCRYPTION : mengaktifkan/menonaktifkan Libzippp dengan kemampuan enkripsi. Default tidak aktif.LIBZIPPP_CMAKE_CONFIG_MODE : Aktifkan/nonaktifkan bangunan dengan file konfigurasi cmake yang diinstal libzip. Default tidak aktif.LIBZIPPP_GNUINSTALLDIRS : Aktifkan/nonaktifkan bangunan dengan direktori instal yang diambil dari gnuinstalldirs. Default tidak aktif.CMAKE_INSTALL_PREFIX : tempat menginstal proyekCMAKE_BUILD_TYPE : diatur untuk melepaskan atau men -debug untuk dibangun dengan atau tanpa optimasiCMAKE_PREFIX_PATH : Daftar jalur awalan yang dipisahkan oleh usus (jalur yang mengandung lib dan include folder) untuk libs terpasang untuk digunakan oleh iniBUILD_SHARED_LIBS : diatur ke ON atau OFF untuk membangun libs bersama atau statis, menggunakan platform default jika tidak diatur Setelah libzippp yang diinstal dapat digunakan dari proyek cmake apa pun dengan mudah:
Mengingat bahwa itu diinstal (melalui CMAKE_INSTALL_PREFIX ) ke lokasi standar atau awalan instalasi diteruskan ke proyek Anda CMAKE_PREFIX_PATH Anda cukup memanggil find_package(libzippp 3.0 REQUIRED) dan menghubungkan dengan libzippp::libzippp .
Saat tidak menggunakan cmake untuk mengkonsumsi libzippp, Anda harus meneruskan direktori ini ke kompiler Anda dan tautan terhadap libzippp.{a,so} . Jangan lupa juga menautkan terhadap perpustakaan libzip misalnya dalam lib/libzip-1.11.2/lib/.libs/ ). Contoh kompilasi dengan 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 Karena versi 1.5, LibZip menggunakan perpustakaan kriptografi yang mendasarinya (OpenSSL, Gnutls atau CommonCrypto) yang diperlukan untuk kompilasi statis. Secara default, libzippp akan menggunakan -lssl -lcrypto (openssl) sebagai bendera default untuk mengkompilasi tes. Ini dapat diubah dengan menggunakan make CRYPTO_FLAGS="-lsome_lib" LIBZIP_CMAKE="" tests .
Karena file Libzip cmake mendeteksi secara otomatis perpustakaan kriptografi untuk digunakan, secara default semua pustaka yang diizinkan tetapi OpenSSL secara eksplisit dinonaktifkan dalam variabel LIBZIP_CMAKE di makefile.
Lihat di sini untuk informasi lebih lanjut.
Cara termudah adalah mengunduh sumber zlib, libzip dan libzippp dan menggunakan cmake gui untuk membangun setiap perpustakaan secara berurutan:
Source ke Folder Sumber Perpustakaan, Build ke folder baru build di dalamnyaGenerateTetapi ada juga file batch yang disiapkan untuk membantu mengotomatisasi ini. Mungkin perlu beberapa penyesuaian.
Pastikan Anda memiliki CMake 3.20 ( cmake.exe harus berada di jalur) dan MS Visual Studio.
Unduh file libzippp- <version> -windows-ready_to_compile.zip dari rilis dan ekstrak di suatu tempat di sistem Anda. Ini akan menciptakan struktur yang disiapkan, sehingga libzippp dapat dikompilasi bersama dengan perpustakaan yang dibutuhkan.
Periksa apakah ada tambalan untuk diterapkan di lib . Terkadang, beberapa file tidak dapat dikompilasi di C89 di libzip, tergantung pada versinya.
Cukup jalankan file compile.bat . Ini akan mengkompilasi Zlib , Libzip dan akhirnya libzippp .
Anda akan memiliki folder Dist yang berisi folder rilis dan debug di mana Anda sekarang dapat menjalankan tes libzippp.
Pastikan Anda memiliki CMake 3.10 ( cmake.exe harus berada di jalur) dan MS Visual Studio 2012.
Unduh sumber Libzip dan Zlib dan ekstrak di folder 'Lib'. Anda harus berakhir dengan struktur berikut:
libzippp/compile.bat
libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.11.2
Jalankan compile.bat (cukup klik dua kali di atasnya). Kompilasi harus pergi tanpa kesalahan.
Anda akan memiliki folder Dist yang berisi folder rilis dan debug di mana Anda sekarang dapat menjalankan tes libzippp.
Anda dapat menggunakan libzippp.dll dan libzippp.lib untuk menautkan secara dinamis perpustakaan atau cukup menggunakan libzippp_static.lib untuk menautkannya secara statis. Kecuali jika Anda juga menautkan Zlib dan Libzippp secara statis, Anda akan memerlukan DLL yang dikemas dengan executable Anda.
API dimaksudkan untuk menjadi sangat lurus ke depan. Beberapa penjelasan Prancis dapat ditemukan di sini.
# 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 ;
}Anda juga dapat membuat arsip langsung dari buffer
# 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 ;
} Secara default, penanganan kesalahan cukup mendasar dan detail kesalahan dibuang ke stderr . Namun, dimungkinkan untuk memberikan metode panggilan balik untuk mengesampingkan perilaku ini. Jika beberapa konteks diperlukan, Anda dapat menggunakan std::bind atau fungsi lambda.
# 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 ;
}Anda mungkin sudah membuat libzip dikompilasi di tempat lain di sistem Anda. Karenanya, Anda tidak perlu menjalankan 'Make Libzip'. Sebaliknya, cukup letakkan lokasi libzip saat Anda mengkompilasi libzippp:
make LIBZIP=path/to/libzip Di bawah Debian, Anda harus menginstal paket zlib1g-dev untuk dikompilasi jika Anda tidak ingin menginstal zlib secara manual.
Secara default, MS Visual Studio 2012 diinstal di bawah jalur berikut:
C:Program Files (x86)Microsoft Visual Studio 11.0
Ketahuilah bahwa kelas-kelas saja dibagikan dalam DLL Libzippp. Oleh karena itu Anda harus menggunakan kompiler yang sama untuk libzippp dan potongan kode yang akan menggunakannya. Untuk menghindari masalah ini, Anda harus menautkan perpustakaan secara statis.
Informasi lebih lanjut di sini.
Penjelasan tambahan dapat ditemukan di sini.
Proyek ini sepenuhnya dikembangkan selama waktu luang saya.
Karena saya penggemar berat cryptocurrency dan terutama Cardano (ADA), Anda dapat mengirimi saya beberapa koin di alamat di bawah ini (periksa di sini):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66