Libzippp เป็น wrapper C ++ พื้นฐานที่เรียบง่ายรอบ ๆ ไลบรารี Libzip มันมีความหมายว่าเป็นห้องสมุดพกพาและใช้งานง่ายสำหรับการจัดการซิป
การรวบรวมได้รับการทดสอบด้วย:
ห้องสมุดพื้นฐาน:
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการบีบอัดที่มีให้ดูที่นี่
Libzippp ได้รับการส่งไปยัง VCPKG และสามารถรวมเข้าด้วยกันได้ง่ายมากโดยการวิ่ง:
./vcpkg install libzippp
ไลบรารีนี้ต้องการการรวบรวมอย่างน้อย C ++ 11
ลินเวกซ์
zlib1g-dev , libzip-dev , liblzma-dev , libbz2-dev )make librariesWindows:
ระบบปฏิบัติการทั้งหมด
LIBZIPPP_ENABLE_ENCRYPTIONmkdir build
cd build
cmake ..
make
make installmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=ReleaseAdd Cache Entry เพื่อเพิ่ม CMAKE_BUILD_TYPE หากไม่ได้สร้างด้วย MSVCConfigure และ GenerateCMAKE_PREFIX_PATH เป็นไดเรกทอรีที่คุณติดตั้งไว้ใน (ไม่ว่าจะผ่าน -DCMAKE_PREFIX_PATH=<...> หรือผ่าน GUI)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL เพื่อติดตั้ง ตั้งค่าผ่าน commandline เป็น cmake -DNAME=VALUE <other opts> หรือผ่าน CMake GUI หรือ CCMake Add Cache Entry
LIBZIPPP_INSTALL : เปิด/ปิดการติดตั้ง Libzippp ค่าเริ่มต้นจะปิดเมื่อใช้ Via add_subdirectory อื่น ๆLIBZIPPP_INSTALL_HEADERS : เปิด/ปิดการติดตั้งส่วนหัว libzippp ค่าเริ่มต้นจะปิดเมื่อใช้ Via add_subdirectory อื่น ๆLIBZIPPP_BUILD_TESTS : เปิด/ปิดการทดสอบอาคาร libzippp ค่าเริ่มต้นจะปิดเมื่อใช้ Via add_subdirectory อื่น ๆLIBZIPPP_ENABLE_ENCRYPTION : เปิด/ปิดการใช้งานอาคาร libzippp ด้วยความสามารถในการเข้ารหัส ค่าเริ่มต้นปิดLIBZIPPP_CMAKE_CONFIG_MODE : เปิดใช้งาน/ปิดการใช้งานอาคารด้วยไฟล์ cmake ที่ติดตั้ง Libzip ค่าเริ่มต้นปิดLIBZIPPP_GNUINSTALLDIRS : เปิด/ปิดการใช้งานอาคารด้วยไดเรกทอรีการติดตั้งที่นำมาจาก gnuinstalldirs ค่าเริ่มต้นปิดCMAKE_INSTALL_PREFIX : สถานที่ติดตั้งโครงการไปที่CMAKE_BUILD_TYPE : ตั้งค่าเป็นปล่อยหรือดีบักเพื่อสร้างโดยมีหรือไม่มีการปรับให้เหมาะสมCMAKE_PREFIX_PATH : รายการเส้นทางคำนำหน้าที่ include lib ลำไส้BUILD_SHARED_LIBS : ตั้งค่าเปิดหรือปิดเพื่อสร้าง LIB ที่ใช้ร่วมกันหรือคงที่ใช้ค่าเริ่มต้นแพลตฟอร์มหากไม่ได้ตั้งค่า เมื่อติดตั้ง libzippp สามารถใช้งานได้จากโครงการ CMake ใด ๆ ได้อย่างง่ายดาย:
ระบุว่ามีการติดตั้ง (ผ่าน CMAKE_INSTALL_PREFIX ) ไปยังตำแหน่งมาตรฐานหรือคำนำหน้าการติดตั้งจะถูกส่งผ่านไปยังโครงการของคุณ CMAKE_PREFIX_PATH คุณสามารถโทรหา find_package(libzippp 3.0 REQUIRED) และเชื่อมโยงกับ libzippp::libzippp
เมื่อไม่ได้ใช้ cmake เพื่อบริโภค libzippp คุณต้องส่งผ่านไดเรกทอรีรวมไปยังคอมไพเลอร์ของคุณและลิงก์กับ libzippp.{a,so} อย่าลืมที่จะเชื่อมโยงกับไลบรารี libzip เช่นใน lib/libzip-1.11.2/lib/.libs/ ) ตัวอย่างของการรวบรวมด้วย 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 ตั้งแต่เวอร์ชัน 1.5 Libzip ใช้ไลบรารีการเข้ารหัสลับ (OpenSSL, GNUTLS หรือ CommonCrypto) ที่จำเป็นสำหรับการรวบรวมแบบคงที่ โดยค่าเริ่มต้น libzippp จะใช้ -lssl -lcrypto (OpenSSL) เป็นค่าสถานะเริ่มต้นเพื่อรวบรวมการทดสอบ สิ่งนี้สามารถเปลี่ยนแปลงได้โดยใช้ make CRYPTO_FLAGS="-lsome_lib" LIBZIP_CMAKE="" tests
เนื่องจากไฟล์ของ Libzip cmake ตรวจพบไลบรารีการเข้ารหัสโดยอัตโนมัติโดยเริ่มต้นโดยค่าเริ่มต้นไลบรารีที่อนุญาตทั้งหมด แต่ OpenSSL จะถูกปิดใช้งานอย่างชัดเจนในตัวแปร LIBZIP_CMAKE ใน makefile
ดูที่นี่สำหรับข้อมูลเพิ่มเติม
วิธีที่ง่ายที่สุดคือการดาวน์โหลดแหล่ง Zlib, Libzip และ Libzippp และใช้ CMake GUI เพื่อสร้างห้องสมุดแต่ละห้องตามลำดับ:
Source จุดไปยังโฟลเดอร์แหล่งที่มาของไลบรารี Build เพื่อ build โฟลเดอร์ใหม่ภายในGenerateแต่ยังมีไฟล์แบตช์ที่เตรียมไว้เพื่อช่วยให้สิ่งนี้เป็นไปโดยอัตโนมัติ มันอาจต้องปรับบางอย่าง
ตรวจสอบให้แน่ใจว่าคุณมี cmake 3.20 ( cmake.exe ต้องอยู่ในเส้นทาง) และ MS Visual Studio
ดาวน์โหลดไฟล์ libzippp- <version> -windows-ready_to_compile.zip จากการเปิดตัวและแยกออกจากระบบของคุณ สิ่งนี้จะสร้างโครงสร้างที่เตรียมไว้ดังนั้น Libzippp สามารถรวบรวมได้พร้อมกับห้องสมุดที่จำเป็น
ตรวจสอบว่ามีแพตช์ใด ๆ ที่จะใช้ใน LIB หรือไม่ บางครั้งไฟล์บางไฟล์ไม่สามารถรวบรวมได้ใน C89 ใน Libzip ขึ้นอยู่กับรุ่น
เพียงเรียกใช้ไฟล์ Compile.bat สิ่งนี้จะรวบรวม zlib , libzip และในที่สุด libzippp
คุณจะมีโฟลเดอร์ DIST ที่มีโฟลเดอร์ รีลีส และ ดีบัก ซึ่งตอนนี้คุณสามารถดำเนินการทดสอบ LIBZIPPP ได้
ตรวจสอบให้แน่ใจว่าคุณมี CMake 3.10 ( cmake.exe ต้องอยู่ในเส้นทาง) และ MS Visual Studio 2012
ดาวน์โหลดแหล่งที่มาของ libzip และ zlib และแยกออกในโฟลเดอร์ 'lib' คุณควรจบลงด้วยโครงสร้างต่อไปนี้:
libzippp/compile.bat
libzippp/lib/zlib-1.3.1
libzippp/lib/libzip-1.11.2
ดำเนินการ Compile.bat (เพียงแค่ดับเบิลคลิกที่มัน) การรวบรวมควรไปโดยไม่มีข้อผิดพลาด
คุณจะมีโฟลเดอร์ DIST ที่มีโฟลเดอร์ รีลีส และ ดีบัก ซึ่งตอนนี้คุณสามารถดำเนินการทดสอบ LIBZIPPP ได้
คุณสามารถใช้ libzippp.dll และ libzippp.lib เพื่อเชื่อมโยงไลบรารีแบบไดนามิกหรือใช้ libzippp_static.lib แบบไดนามิกแบบไดนามิก หากคุณไม่ได้เชื่อมโยง Zlib และ Libzippp แบบคงที่คุณจะต้องมี DLL ที่บรรจุด้วยการปฏิบัติการของคุณ
API มีความหมายที่จะตรงไปตรงมามาก คำอธิบายภาษาฝรั่งเศสบางอย่างสามารถพบได้ที่นี่
# 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 ;
}คุณยังสามารถสร้างคลังเก็บโดยตรงจากบัฟเฟอร์
# 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 ;
} โดยค่าเริ่มต้นการจัดการข้อผิดพลาดนั้นค่อนข้างพื้นฐานและรายละเอียดข้อผิดพลาดจะถูกทิ้งไปยัง stderr อย่างไรก็ตามมันเป็นไปได้ที่จะให้วิธีการโทรกลับเพื่อแทนที่พฤติกรรมนี้ หากต้องการบริบทบางอย่างคุณอาจใช้ std::bind หรือ Lambda-functions
# 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 ;
}คุณอาจมี Libzip รวบรวมไว้ที่อื่นในระบบของคุณ ดังนั้นคุณไม่จำเป็นต้องเรียกใช้ 'Make Libzip' เพียงแค่ใส่ตำแหน่ง libzip เมื่อคุณรวบรวม libzippp:
make LIBZIP=path/to/libzip ภายใต้ Debian คุณจะต้องติดตั้งแพ็คเกจ zlib1g-dev เพื่อรวบรวมหากคุณไม่ต้องการติดตั้ง Zlib ด้วยตนเอง
โดยค่าเริ่มต้น MS Visual Studio 2012 ได้รับการติดตั้งภายใต้เส้นทางต่อไปนี้:
C:Program Files (x86)Microsoft Visual Studio 11.0
โปรดทราบว่าคลาสที่ไม่ใช่เสมือนเพียงอย่างเดียวนั้นใช้ร่วมกันภายใน DLL ของ Libzippp ดังนั้นคุณจะต้องใช้คอมไพเลอร์เดียวกันสำหรับ libzippp และชิ้นส่วนของรหัสที่จะใช้ เพื่อหลีกเลี่ยงปัญหานี้คุณจะต้องเชื่อมโยงไลบรารีแบบคงที่
ข้อมูลเพิ่มเติมที่นี่
คำอธิบายเพิ่มเติมสามารถพบได้ที่นี่
โครงการนี้ได้รับการพัฒนาอย่างสมบูรณ์ในช่วงเวลาว่าง
เนื่องจากฉันเป็นแฟนตัวยงของ cryptocurrencies และโดยเฉพาะอย่างยิ่ง Cardano (ADA) คุณสามารถส่งเหรียญให้ฉันได้ตามที่อยู่ด้านล่าง (ตรวจสอบที่นี่):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66