العمل مع أرشيفات ZIP في C# (.NET)
في التطوير الحديث على منصة .NET، يعد العمل مع الأرشيفات من المهام الشائعة. سواء كان ذلك لتغليف السجلات، إنشاء نسخ احتياطية، أو نقل البيانات عبر الشبكة - فإن القدرة على ضغط وفك ضغط الملفات بكفاءة ضرورية لكل مطور C#. في هذه المقالة، سنشرح بالتفصيل نهجين رئيسيين: مساحة الأسماء المضمنة System.IO.Compression والمكتبة الخارجية SharpZipLib.
الأدوات المضمنة في .NET: System.IO.Compression
بدءًا من .NET Framework 4.5، توفر المنصة واجهة برمجة تطبيقات أصلية للعمل مع أرشيفات ZIP. توجد الفئات الرئيسية في مساحة الأسماء System.IO.Compression.
إنشاء أرشيف ZIP
لإنشاء أرشيف، يتم استخدام الفئة ZipArchive مع ZipFile:
using System.IO;using System.IO.Compression;
string sourceDirectory = @"C:\\Data\\Reports";string zipPath = @"C:\\Archives\\reports.zip";
if (File.Exists(zipPath)) File.Delete(zipPath);
ZipFile.CreateFromDirectory(sourceDirectory, zipPath);Console.WriteLine("تم إنشاء الأرشيف: " + zipPath);استخراج الأرشيف
يتم فك الضغط بطريقة مماثلة - باستخدام طريقة ExtractToDirectory:
string extractPath = @"C:\\Data\\Extracted";ZipFile.ExtractToDirectory(zipPath, extractPath);Console.WriteLine("تم استخراج الأرشيف إلى: " + extractPath);العمل مع الإدخالات الفردية
للتحكم الدقيق، استخدم ZipArchive مباشرة:
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"الملف: {entry.FullName}, الحجم: {entry.Length} بايت"); // استخراج ملف معين entry.ExtractToFile(Path.Combine(extractPath, entry.FullName), true); }}مكتبة SharpZipLib
SharpZipLib هي مكتبة خارجية قوية مفتوحة المصدر، توفر إمكانيات متقدمة مقارنة بالأدوات المضمنة. تدعم المزيد من التنسيقات (GZip, BZip2, Tar) وتمنح تحكمًا أكثر مرونة في عملية الضغط.
تثبيت SharpZipLib
قم بتثبيت المكتبة عبر NuGet Package Manager:
Install-Package SharpZipLibأو عبر .NET CLI:
dotnet add package SharpZipLibإنشاء أرشيف باستخدام SharpZipLib
using ICSharpCode.SharpZipLib.Zip;using ICSharpCode.SharpZipLib.Core;
string outputZip = @"C:\\Archives\\backup.zip";string[] filesToZip = Directory.GetFiles(@"C:\\Data\\Files", "*.*", SearchOption.AllDirectories);
using (FileStream fsOut = File.Create(outputZip))using (ZipOutputStream zipStream = new ZipOutputStream(fsOut)){ zipStream.SetLevel(9); // أقصى ضغط (0-9)
foreach (string filename in filesToZip) { FileInfo fi = new FileInfo(filename); string entryName = ZipEntry.CleanName(fi.Name); ZipEntry newEntry = new ZipEntry(entryName); newEntry.DateTime = fi.LastWriteTime; newEntry.Size = fi.Length;
zipStream.PutNextEntry(newEntry);
byte[] buffer = new byte[4096]; using (FileStream fsInput = File.OpenRead(filename)) { StreamUtils.Copy(fsInput, zipStream, buffer); } zipStream.CloseEntry(); }}استخراج أرشيف باستخدام SharpZipLib
string inputZip = @"C:\\Archives\\backup.zip";string outputDir = @"C:\\Data\\Restored";
using (FileStream fsIn = File.OpenRead(inputZip))using (ZipInputStream zipStream = new ZipInputStream(fsIn)){ ZipEntry entry; while ((entry = zipStream.GetNextEntry()) !=