العمل مع أرشيفات ZIP في C# (.NET): دليل شامل

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

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

ابدأ الدورة

العمل مع أرشيفات 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:<

توصيات