العمل مع أرشيفات ZIP في C++: مكتبة libzip و zlib

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع أرشيفات ZIP في C++: libzip و zlib



في التطوير الحديث بلغة C++، غالبًا ما تنشأ الحاجة إلى ضغط وفك ضغط البيانات. تظل أرشيفات ZIP واحدة من أكثر التنسيقات شيوعًا نظرًا لتنوعها ودعمها للضغط. في هذه المقالة، سننظر في مكتبتين رئيسيتين للعمل مع ZIP في C++: libzip (العمل عالي المستوى مع الأرشيفات) و zlib (الضغط منخفض المستوى). ستتعلم كيفية تثبيت المكتبات، وإنشاء أرشيف، واستخراج الملفات، وقراءة المحتوى دون فك الضغط.



المكتبات الرئيسية للعمل مع ZIP في C++

  • libzip — مكتبة متعددة المنصات لإنشاء وقراءة وتعديل أرشيفات ZIP. تدعم التشفير، التدفقات، والعمل مع الذاكرة.
  • zlib — مكتبة ضغط بيانات منخفضة المستوى (خوارزمية Deflate). تُستخدم كأساس لـ libzip وأدوات الأرشفة الأخرى.
  • minizip — غلاف خفيف الوزن فوق zlib للعمل مع تنسيق ZIP (غالبًا ما يكون جزءًا من zlib).

لمعظم المهام، يُوصى باستخدام libzip لأنها توفر واجهة برمجة تطبيقات أكثر ملاءمة وأمانًا.



تثبيت المكتبات

في Linux (Ubuntu/Debian) يتم التثبيت عبر مدير الحزم:

sudo apt-get install libzip-dev zlib1g-dev

لنظام macOS (Homebrew):

brew install libzip zlib

في Windows، يمكنك استخدام vcpkg أو تنزيل الملفات الثنائية المجمعة من المواقع الرسمية.

الإدراج في CMakeLists.txt:

find_package(ZLIB REQUIRED)find_package(LibZip REQUIRED)target_link_libraries(your_project ZLIB::ZLIB libzip::zip)


مثال 1: إنشاء أرشيف ZIP باستخدام libzip

سننشئ أرشيف example.zip ونضيف إليه ملفًا نصيًا:

#include <zip.h>#include <iostream>#include <string>

int main() { const char* archive_name = "example.zip"; int err = 0;

// فتح الأرشيف للكتابة zip_t* archive = zip_open(archive_name, ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "خطأ في إنشاء الأرشيف: " << err << std::endl; return 1; }

// البيانات المراد كتابتها const char* filename = "hello.txt"; const char* content = "مرحبًا بالعالم! Hello, C++!"; // إنشاء مصدر بيانات من الذاكرة zip_source_t* source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "خطأ في إنشاء المصدر" << std::endl; zip_close(archive); return 1; }

// إضافة الملف إلى الأرشيف zip_int64_t index = zip_file_add(archive, filename, source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "خطأ في إضافة الملف: " << zip_strerror(archive) << std::endl; zip_source_free(source); zip_close(archive); return 1; }

// إغلاق الأرشيف zip_close(archive); std::cout << "تم إنشاء الأرشيف: " << archive_name << std::endl; return 0;}


مثال 2: فك ضغط أرشيف ZIP

سنستخرج جميع الملفات من الأرشيف إلى الدليل الحالي:

#include <zip.h>#include <iostream>#include <fstream>

int main() { const char* archive_name = "example.zip"; int err = 0;

// فتح الأرشيف للقراءة zip_t* archive = zip_open(archive_name, 0, &err); if (!archive) { std::cerr << "خطأ في فتح الأرشيف: " << err << std::endl; return 1; }

zip_int64_t num_entries = zip_get_num_entries(archive, 0); for (zip_int64_t i = 0; i < num_entries; ++i) { // الحصول على اسم الملف const char* filename = zip_get_name(archive, i, 0); if (!filename) continue;

// فتح الملف

توصيات