C# (.NET) में ZIP/आर्काइव के साथ काम करना: पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# (.NET) में ZIP-आर्काइव के साथ काम करना

.NET प्लेटफ़ॉर्म पर आधुनिक डेवलपमेंट में, आर्काइव के साथ काम करना एक सामान्य कार्य है। चाहे वह लॉग को पैकेज करना हो, बैकअप बनाना हो, या नेटवर्क पर डेटा ट्रांसफर करना हो — फ़ाइलों को कुशलतापूर्वक कम्प्रेस और डीकम्प्रेस करने की क्षमता हर C# डेवलपर के लिए आवश्यक है। इस लेख में, हम दो मुख्य दृष्टिकोणों पर विस्तार से चर्चा करेंगे: बिल्ट-इन System.IO.Compression नेमस्पेस और तीसरे पक्ष की लाइब्रेरी SharpZipLib।

.NET के बिल्ट-इन टूल: System.IO.Compression

.NET Framework 4.5 से शुरू करके, प्लेटफ़ॉर्म ZIP-आर्काइव के साथ काम करने के लिए एक नेटिव API प्रदान करता है। मुख्य क्लासेस 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()) != null)
    {
        if (!entry.IsDirectory)
        {
            string fullPath = Path.Combine(outputDir, entry.Name);
            string directoryPath = Path.GetDirectoryName(fullPath);
            if (!Directory.Exists(directoryPath))
                Directory.CreateDirectory(directoryPath);

            using (FileStream fsOut = File.Create(fullPath))
            {
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = zipStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    fsOut.Write(buffer, 0, bytesRead);
                }
            }
        }
    }
}

अनुशंसाएँ