العمل مع أرشيفات ZIP في Node.js: مكتبات adm-zip و archiver
في تطوير الويب الحديث باستخدام Node.js، غالبًا ما تنشأ الحاجة للعمل مع الأرشيفات: لتعبئة السجلات، ونقل الملفات في مجموعات، وفك ضغط البيانات التي رفعها المستخدم. في هذه المادة، سنستعرض مكتبتين رئيسيتين للعمل مع تنسيق ZIP — adm-zip و archiver. إنهما تحلان تقريبًا جميع المهام المتعلقة بالأرشفة، وتناسبان تمامًا كلًا من البرامج النصية البسيطة وتطبيقات الإنتاج.
مكتبة adm-zip: أداة شاملة لقراءة وكتابة ZIP
adm-zip هي تطبيق خالص بلغة JavaScript للعمل مع أرشيفات ZIP بدون تبعيات خارجية. تسمح بإنشاء أرشيفات جديدة، وكذلك قراءة وتعديل الأرشيفات الموجودة. المكتبة سهلة الاستخدام ولا تتطلب تثبيت أدوات نظام إضافية.
التثبيت
npm install adm-zipإنشاء أرشيف ZIP
const AdmZip = require('adm-zip');const fs = require('fs');
// إنشاء مثيل جديد للأرشيفconst zip = new AdmZip();
// إضافة ملفات من مخزن مؤقت أو سلسلة نصيةzip.addFile('hello.txt', Buffer.from('Hello, World!', 'utf8'));
// إضافة ملف محليzip.addLocalFile('/path/to/image.png');
// إضافة مجلد كاملzip.addLocalFolder('/path/to/documents', 'docs');
// كتابة الأرشيف على القرصzip.writeZip('./output/archive.zip');
console.log('تم إنشاء الأرشيف بنجاح!');قراءة وفك ضغط أرشيف موجود
const AdmZip = require('adm-zip');
// تحميل أرشيف موجودconst zip = new AdmZip('./input/archive.zip');
// الحصول على قائمة الملفاتconst zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`الملف: ${entry.entryName}, الحجم: ${entry.header.size} بايت`);});
// استخراج جميع الملفات إلى مجلد محددzip.extractAllTo('./extracted', true); // true — استبدال الملفات الموجودة
// أو الحصول على محتوى ملف معينconst content = zip.readAsText('data.json');console.log('محتوى data.json:', content);العمل مع المخازن المؤقتة (بدون كتابة على القرص)
const AdmZip = require('adm-zip');const zip = new AdmZip();
zip.addFile('report.csv', 'id,name,age1,John,30');
// الحصول على الأرشيف كـ Buffer لإرساله عبر HTTPconst archiveBuffer = zip.toBuffer();
// الآن يمكن إرسال archiveBuffer كاستجابة من الخادم// أو تمريره إلى دالة أخرىمكتبة archiver: أرشفة متقدمة بتدفق البيانات
archiver هي مكتبة أكثر قوة، محسّنة للعمل مع كميات كبيرة من البيانات. تستخدم التدفقات (streams) في Node.js، مما يسمح بأرشفة الملفات "أثناء الطيران" دون تحميل المحتوى بأكمله في الذاكرة. هذا هو الخيار المثالي لتطبيقات الخادم ذات الموارد المحدودة.
التثبيت
npm install archiverإنشاء أرشيف مع إخراج متدفق
const archiver = require('archiver');const fs = require('fs');const path = require('path');
// إنشاء تدفق كتابةconst output = fs.createWriteStream('./backup.zip');const archive = archiver('zip', { zlib: { level: 9 } // أقصى درجة ضغط});
// معالجة الأحداثoutput.on('close', () => { console.log(`تم إنشاء الأرشيف: ${archive.pointer()} بايت`);});
archive.on('error', (err) => { throw err;});
// توصيل تدفق الأرشيف بملف الإخراجarchive.pipe(output);
// إضافة ملفاتarchive.file('/var/log/app.log', { name: 'logs/app.log' });
// إضافة دليل بشكل متكررarchive.directory('uploads/', 'user_files');
// إضافة سلسلة نصية كملفarchive.append('هذا هو محتوى الملف', { name: 'readme.txt' });
// إنهاء الأرشفةarchive.finalize();إرسال الأرشيف عبر استجابة HTTP
const express = require('ex أيضاً في المكتبة
التعلم الآلي باستخدام TypeScript: نظرة عامة على مكتبات ML في 2024
التخزين المؤقت في Java: Redis، Ehcache، Caffeine، Hazelcast — نظرة عامة وأمثلة
SwiftConfig: إدارة تكوين التطبيقات بلغة Swift
العمل مع الصور في Rust: نظرة عامة على مكتبات image و fast_image_resize وغيرها