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

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

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

ابدأ الدورة

العمل مع أرشيفات ZIP في C++: من البسيط إلى المعقد



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



لماذا ZIP بالتحديد؟

تنسيق ZIP هو المعيار الفعلي للضغط بدون فقدان. وهو مدعوم من جميع أنظمة التشغيل، ويسمح بتخزين ملفات ومجلدات متعددة، ويدعم التشفير والمعالجة التدفقية. لا توجد في C++ دعم مدمج لـ ZIP (باستثناء <filesystem> التجريبي)، لذلك نستخدم مكتبات خارجية.



مكتبة libzip: أداة قوية للمهام الجادة

libzip هي مكتبة متعددة المنصات بلغة C، مع واجهة برمجة تطبيقات ممتازة متوافقة مع C++. توفر تحكمًا كاملاً في الأرشيفات: إنشاء، قراءة، تعديل، حذف الملفات، العمل مع التعليقات والبيانات الوصفية.



تثبيت libzip (Linux/macOS)

# Ubuntu/Debiansudo apt-get install libzip-dev

# macOS (Homebrew)brew install libzip

# Windows — عبر vcpkg أو التحميل من موقع libzip.org


مثال 1: إنشاء أرشيف ZIP

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

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

int main() { // فتح الأرشيف للكتابة (APPEND_CREATE سينشئ ملفًا جديدًا) int err = 0; zip_t *archive = zip_open("example.zip", ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "خطأ في إنشاء الأرشيف: " << err << std::endl; return 1; }

// بيانات الملف const char *content = "Hello from PythonLib!"; 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, "hello.txt", 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 << "تم إنشاء الأرشيف بنجاح!" << std::endl; return 0;}


مثال 2: فك ضغط جميع الملفات من الأرشيف

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

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

int main() { int err = 0; zip_t *archive = zip_open("example.zip", ZIP_RDONLY, &err); if (!archive) { std::cerr << "خطأ في فتح الأرشيف" << 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;

// فتح الملف داخل الأرشيف zip_file_t *zf = zip_fopen_index(archive, i, 0); if (!zf) { std::cerr << "فشل فتح: " << filename << std::endl; continue; }

// قراءة البيانات وكتابتها في ملف char buffer[1024]; std::ofstream out(filename, std::ios::binary); zip_int64_t bytes_read; while ((bytes_read = zip_fread(zf, buffer, sizeof(buffer))) > 0) { out.write(b

توصيات