Libzippp هو غلاف C ++ أساسي بسيط حول مكتبة Libzip. من المفترض أن تكون مكتبة محمولة وسهلة الاستخدام للتعامل مع الرمز البريدي.
تم اختبار التجميع مع:
المكتبات الأساسية:
لمزيد من المعلومات حول طرق الضغط المتاحة ، انظر هنا.
تم نقل Libzippp إلى VCPKG ، وبالتالي يمكن دمجها بسهولة بالغة عن طريق التشغيل:
./vcpkg install libzippp
تتطلب هذه المكتبة على الأقل C ++ 11 لتجميع.
Linux
zlib1g-dev ، libzip-dev ، liblzma-dev ، libbz2-dev ).make libraries .Windows:
جميع أنظمة التشغيل
LIBZIPPP_ENABLE_ENCRYPTION .mkdir 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=<...> أو عبر واجهة المستخدم الرسومية)-DCMAKE_PREFIX_PATH=/home/user/libzip-1.11.2:/home/user/zlib-1.3.1make && make installINSTALL للتثبيت. تم تعيينه عبر سطر الأوامر كـ cmake -DNAME=VALUE <other opts> أو عبر Cmake GUI أو CCMake Add Cache Entry .
LIBZIPPP_INSTALL : تمكين/تعطيل تثبيت libzippp. الافتراضي متوقف عند الاستخدام عبر add_subdirectory ، وإلاLIBZIPPP_INSTALL_HEADERS : تمكين/تعطيل تثبيت رؤوس libzippp. الافتراضي متوقف عند الاستخدام عبر add_subdirectory ، وإلاLIBZIPPP_BUILD_TESTS : تمكين/تعطيل اختبارات libzippp. الافتراضي متوقف عند الاستخدام عبر add_subdirectory ، وإلاLIBZIPPP_ENABLE_ENCRYPTION : تمكين/تعطيل بناء libzippp مع قدرات التشفير. الافتراضي هو خارج.LIBZIPPP_CMAKE_CONFIG_MODE : تمكين/تعطيل البناء باستخدام ملفات تكوين cmake المثبتة libzip. الافتراضي هو خارج.LIBZIPPP_GNUINSTALLDIRS : تمكين/تعطيل المبنى مع دليل تثبيت المأخوذ من gnuinstalldirs. الافتراضي هو خارج.CMAKE_INSTALL_PREFIX : حيث يتم تثبيت المشروع علىCMAKE_BUILD_TYPE : تعيين لإصدار أو تصحيح للبناء مع أو بدون تحسيناتCMAKE_PREFIX_PATH : قائمة مسارات بادئة مفصولة بالقولون ( lib includeBUILD_SHARED_LIBS : ضبط على ON أو OFF لبناء libs المشتركة أو الثابتة ، يستخدم الافتراضي منصة إذا لم يتم تعيينه بمجرد تثبيت 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 يكتشف تلقائيًا لمكتبة التشفير التي يجب استخدامها ، بشكل افتراضي جميع المكتبات المسموح بها ولكن يتم تعطيل OpenSL بشكل واضح في متغير LIBZIP_CMAKE في Makefile.
انظر هنا لمزيد من المعلومات.
أسهل طريقة هي تنزيل مصادر Zlib و Libzip و Libzippp واستخدام Cmake Gui لبناء كل مكتبة بالترتيب:
Source النقطة إلى مجلد مصدر المكتبات ، Build إلى مجلد جديد build بداخلهGenerateولكن هناك أيضًا ملف دفعي جاهز للمساعدة في أتمتة هذا. قد تحتاج إلى بعض التعديل رغم ذلك.
تأكد من أن لديك Cmake 3.20 ( cmake.exe يجب أن يكون في المسار) و MS Visual Studio.
قم بتنزيل ملف libzippp- <splex> -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 تم تجميعها في مكان آخر على نظامك. وبالتالي ، لا تحتاج إلى تشغيل "جعل 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 وقطع الكود التي ستستخدمه. لتجنب هذه المشكلة ، سيتعين عليك ربط المكتبة بشكل ثابت.
مزيد من المعلومات هنا.
يمكن العثور على تفسيرات إضافية هنا.
تم تطوير هذا المشروع بالكامل خلال وقت فراغي.
نظرًا لأنني من المعجبين بالعملات المشفرة وخاصة Cardano (ADA) ، يمكنك أن ترسل لي بعض العملات المعدنية على العنوان أدناه (تحقق من ذلك هنا):
addr1q9sgms4vc038nq7hu4499yeszy0rsq3hjeu2k9wraksle8arg0n953hlsrtdzpfnxxw996l4t6qu5xsx8cmmakjcqhksaqpj66