العمل مع أرشيفات ZIP في Node.js: مكتبتا archiver و adm-zip

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

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

ابدأ الدورة

العمل مع أرشيفات ZIP في Node.js: مكتبتا archiver و adm-zip



في تطوير الويب الحديث باستخدام Node.js، غالبًا ما تنشأ الحاجة إلى ضغط الملفات في أرشيفات أو استخراج البيانات منها. سواء كان ذلك للنسخ الاحتياطي، أو تحميل عدة ملفات في أرشيف واحد، أو معالجة بيانات المستخدم — يظل العمل مع تنسيق ZIP مطلوبًا. بالنسبة لـ Node.js، توجد عدة مكتبات شائعة، وفي هذه المقالة سنستعرض اثنتين من أقوى وأسهل المكتبات: archiver (لإنشاء الأرشيفات) و adm-zip (لقراءة ومعالجة الأرشيفات).



لماذا نحتاج إلى مكتبات للعمل مع ZIP؟

لا يوفر Node.js افتراضيًا أدوات مدمجة للعمل مع الأرشيفات. على الرغم من وجود وحدة zlib لضغط التدفقات الفردية، إلا أن إنشاء ملفات ZIP كاملة تحتوي على عدة ملفات ومجلدات يتطلب حلولاً متخصصة. تحل مكتبتا archiver و adm-zip هذه المهام، حيث تقدمان واجهة برمجة تطبيقات بسيطة وأداءً عاليًا.



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

يتم تثبيت كلتا المكتبتين عبر npm. قم بتنفيذ الأمر التالي في الطرفية:

npm install archiver adm-zip


مكتبة archiver: إنشاء أرشيفات ZIP

archiver هي مكتبة لإنشاء أرشيفات بتنسيقات مختلفة (ZIP, TAR, GZIP). تعمل مع التدفقات (streams)، مما يسمح بمعالجة كميات كبيرة من البيانات بكفاءة دون تحميل الملف بأكمله في الذاكرة.



الميزات الرئيسية لـ archiver:

  • إنشاء أرشيفات ZIP بمستوى ضغط قابل للتخصيص
  • إضافة ملفات ومجلدات كاملة
  • العمل مع التدفقات (streams) لتوفير الذاكرة
  • دعم التعليقات والبيانات الوصفية


مثال: إنشاء أرشيف ZIP بسيط

const fs = require('fs');const archiver = require('archiver');

// إنشاء تدفق كتابة إلى ملفconst output = fs.createWriteStream('example.zip');const archive = archiver('zip', { zlib: { level: 9 } }); // أقصى ضغط

// معالجة الأحداثoutput.on('close', () => { console.log(`تم إنشاء الأرشيف: ${archive.pointer()} بايت`);});

archive.on('error', (err) => { throw err;});

// إضافة الملفاتarchive.append('محتوى الملف 1', { name: 'file1.txt' });archive.file('/path/to/existing/file.txt', { name: 'renamed-file.txt' });archive.directory('my_folder/', 'new_folder_name');

// إنهاء الأرشفةarchive.pipe(output);archive.finalize();


مثال: الأرشفة مع النقل التدفقي

const http = require('http');const archiver = require('archiver');

http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'application/zip', 'Content-disposition': 'attachment; filename=download.zip' });

const archive = archiver('zip', { zlib: { level: 5 } }); archive.pipe(res);

archive.append('ملف نصي', { name: 'text.txt' }); archive.append(Buffer.from([0x00, 0x01, 0x02]), { name: 'binary.bin' }); archive.finalize();}).listen(3000);


مكتبة adm-zip: قراءة واستخراج الأرشيفات

adm-zip هي مكتبة متعددة الاستخدامات للعمل مع أرشيفات ZIP: القراءة، الكتابة، التحديث، والاستخراج. على عكس archiver، فهي لا تعمل مع التدفقات فحسب، بل أيضًا مع المخازن المؤقتة (buffers)، مما يجعلها مناسبة للأرشيفات الصغيرة.



الميزات الرئيسية لـ adm-zip:

  • قراءة ملفات ZIP الموجودة
  • استخراج جميع الملفات أو ملفات محددة
  • كتابة أرشيفات جديدة (بديل لـ archiver)
  • العمل مع المخازن المؤقتة والسلاسل النصية


مثال: استخراج الملفات من أرشيف

const AdmZip = require('adm-zip');

// تحميل أرشيف موجودconst zip = new AdmZip('./example.zip');

// الحصول على قائمة الملفاتconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`ملف

توصيات