العمل مع أرشيفات ZIP في C# (.NET): دليل شامل
في التطوير الحديث على منصة .NET، يعد العمل مع الأرشيفات من المهام الشائعة. سواء كان ذلك لتغليف السجلات، أو فك ضغط الإعدادات، أو إنشاء نسخ احتياطية - فإن الأدوات المدمجة System.IO.Compression تتيح القيام بذلك بكفاءة دون الحاجة إلى مكتبات خارجية. في هذه المقالة، سنستعرض العمليات الأساسية مع أرشيفات ZIP في C#، بما في ذلك الضغط، الاستخراج، إضافة الملفات، والعمل مع التدفقات.
مساحات الأسماء المطلوبة
للعمل مع الأرشيفات في .NET، يتم استخدام مساحتي اسم رئيسيتين:
using System.IO;using System.IO.Compression;بدءًا من .NET Framework 4.5، يكون الفصل ZipFile متاحًا في التجميعة System.IO.Compression.FileSystem. في .NET Core / .NET 5+، يتم تضمينه في المكتبة الأساسية.
إنشاء أرشيف ZIP من الملفات
أبسط طريقة لإنشاء أرشيف هي استخدام الطريقة الثابتة ZipFile.CreateFromDirectory. تأخذ مسار المجلد، مسار الأرشيف، ومستوى الضغط.
string sourceFolder = @"C:\\Temp\\Documents";string zipPath = @"C:\\Temp\\backup.zip";
// إنشاء أرشيف بمستوى ضغط OptimalZipFile.CreateFromDirectory(sourceFolder, zipPath, CompressionLevel.Optimal, false);
Console.WriteLine($"تم إنشاء الأرشيف: {zipPath}");المعلمات:
- sourceFolder — الدليل المصدر؛
- zipPath — مسار الأرشيف المستقبلي؛
- CompressionLevel —
Optimal،FastestأوNoCompression؛ - includeBaseDirectory — إذا كان
true، سيتم تضمين المجلد الجذر في الأرشيف.
فك ضغط أرشيف ZIP
يتم استخراج الملفات باستخدام الطريقة ZipFile.ExtractToDirectory:
string zipPath = @"C:\\Temp\\backup.zip";string extractPath = @"C:\\Temp\\Restored";
// فك الضغط مع استبدال الملفات الموجودةZipFile.ExtractToDirectory(zipPath, extractPath, overwriteFiles: true);
Console.WriteLine("تم فك ضغط الأرشيف.");في .NET 6+، تمت إضافة المعامل overwriteFiles، الذي يسمح باستبدال الملفات دون استثناءات.
إضافة ملفات إلى أرشيف موجود
الفصل ZipArchive يمنح تحكمًا كاملاً في المحتوى. سنفتح الأرشيف في وضع التحديث ونضيف ملفًا جديدًا:
string zipPath = @"C:\\Temp\\backup.zip";string newFile = @"C:\\TempewDocument.txt";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.ReadWrite))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update)){ // إنشاء إدخال في الأرشيف ZipArchiveEntry entry = archive.CreateEntry("newDocument.txt");
using (StreamWriter writer = new StreamWriter(entry.Open())) { writer.Write("هذا هو محتوى الملف الجديد."); }
Console.WriteLine($"تمت إضافة الملف {newFile} إلى الأرشيف.");}هام: عند استخدام ZipArchiveMode.Update، يجب فتح الأرشيف للقراءة والكتابة.
قراءة محتوى الأرشيف دون فك الضغط
أحيانًا نحتاج فقط إلى رؤية الملفات الموجودة بالداخل. لهذا، نقوم بالتكرار على إدخالات الأرشيف:
string zipPath = @"C:\\Temp\\backup.zip";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.Read))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"الملف: {entry.FullName}, الحجم: {entry.Length} بايت"); }}الخاصية FullName تحتوي على المسار داخل الأرشيف، بما في ذلك المجلدات الفرعية.
العمل مع التدفقات: الضغط وفك الضغط في الذاكرة
للسيناريوهات التي تحتاج فيها إلى نقل الأرشيف عبر الشبكة أو حفظه في قاعدة بيانات، من المناسب استخدام MemoryStream:<
أيضاً في المكتبة
معالجة Markdown بلغة Rust: المكتبات، المحللات والأدوات
العمل مع التواريخ في Swift: Foundation, SwiftDate, DateTools (iOS/macOS)
معالجة JSON في TypeScript: التصنيف، التحقق من الصحة والتحليل
مجدول المهام بلغة PHP: مكتبة cron‑expression للجدولة المرنة
gRPC لجافا سكريبت (Node.js): المكتبات، الإعداد وأمثلة الكود