پایگاه دانش

فشرده‌سازی یا استخراج فایل‌ها با C# - فشرده‌سازی و استخراج فایل‌ها

ZIP (قالب فایل) چیست؟

ZIP یک قالب فایل بایگانی است که از فشرده‌سازی بدون اتلاف داده پشتیبانی می‌کند. یک فایل ZIP می‌تواند شامل یک یا چند فایل یا پوشه باشد که قبلاً فشرده شده‌اند. فایل‌های ZIP معمولاً پسوندهای ‎.zip‎ یا ‎.ZIP‎ و نوع MIME ‎application/zip‎ را دارند. بسیاری از برنامه‌ها به‌عنوان قالب پایه از ZIP استفاده می‌کنند، اگرچه ممکن است تحت نام‌های متفاوتی شناخته شوند. هنگام مرور یک سیستم فایل از طریق رابط کاربری، نمادهای گرافیکی نمایانگر فایل‌های ZIP اغلب به‌صورت سند یا شیء دیگری ظاهر می‌شوند که به‌وضوح نشانگر یک زیپ‌پر است.

روش‌های متعددی برای فشرده‌سازی (ZIP) فایل‌ها وجود دارد (چندین روش برای فشرده‌سازی فایل‌ها ) که بسته به سیستم‌عامل شما متفاوت است. تقریباً هر روز نیاز به فشرده یا استخراج برخی فایل‌ها و ارسال آن‌ها به سرورهای ذخیره‌سازی یا پلتفرم‌های اشتراک‌گذاری داریم. خوشبختانه می‌توان این فرآیند را با استفاده از Aspose.ZIP API خودکار کرد. این API به شما امکان فشرده‌سازی و استخراج فایل‌ها را بدون نگرانی درباره ساختار داخلی می‌دهد. این مقاله نحوه کار با فشرده‌سازی تک‌فایل و چند‌فایل را نشان می‌دهد.

پکیج Aspose.ZIP می‌تواند با دستور زیر به پروژه .NET شما اضافه شود:

PM> Install-Package Aspose.Zip

نحوه فشرده‌سازی یک فایل تک با C#

  1. ابتدا باید یک شیء از کلاس FileStream برای آرشیو ZIP خروجی ایجاد کنیم.
  2. یک فایل تک را به شیء FileStream بارگذاری می‌کنیم.
  3. یک شیء از کلاس Archive می‌سازیم.
  4. فایل را با استفاده از متد Archive.CreateEntry ( “FileName”, FileStream) به آرشیو اضافه می‌کنیم.
  5. آرشیو ZIP را با متد Archive.Save (FileStream) ذخیره می‌کنیم.
using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
{
    // فایلی که باید به آرشیو اضافه شود
    using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
    {
        using (var archive = new Archive(new ArchiveEntrySettings()))
        {
            archive.CreateEntry("alice29.txt", source1);
            archive.Save(zipFile);
        }
    }
}

فشرده‌سازی چندین فایل با C#

تفاوت فشرده‌سازی یک فایل تک و چندین فایل در این است که باید چندین فایل را به شیء FileStream بارگذاری کرده و همه آن‌ها را با متد Archive.CreateEntry("FileName", FileStream) به آرشیو ZIP اضافه کنیم. کد زیر نشان می‌دهد چگونه می‌توان چندین فایل را با استفاده از FileStream به ZIP اضافه کرد.

// ایجاد FileStream برای آرشیو ZIP خروجی
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
    // فایل اول برای افزودن به آرشیو
    using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
    {
        // فایل دوم برای افزودن به آرشیو
        using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
        {
            using (var archive = new Archive())
            {
                // افزودن فایل‌ها به آرشیو
                archive.CreateEntry("alice29.txt", source1);
                archive.CreateEntry("asyoulik3.txt", source2);
                // فشرده‌سازی فایل‌ها
                archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "دو فایل در این آرشیو فشرده شده‌اند" });
            }
        }
    }
}

فشرده‌سازی فایل‌ها با کلاس FileInfo

می‌توان فایل‌ها را با استفاده از کلاس FileInfo بارگذاری کرد و به همان روش قبلی به آرشیو ZIP اضافه نمود. کلاس FileInfo ویژگی‌ها و متدهای نمونه‌ای برای ایجاد، کپی، حذف، جابه‌جایی و باز کردن فایل‌ها فراهم می‌کند و به ساخت اشیاء FileStream کمک می‌کند.

using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
    // فایل‌های موردنظر برای افزودن به آرشیو
    FileInfo fi1 = new FileInfo("alice29.txt");
    FileInfo fi2 = new FileInfo("fields.c");
    using (var archive = new Archive())
    {
        // افزودن فایل‌ها به آرشیو
        archive.CreateEntry("alice29.txt", fi1);
        archive.CreateEntry("fields.c", fi2);
        // ایجاد آرشیو ZIP
        archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
    }
}

ذخیره‌سازی فایل‌ها در آرشیو بدون فشرده‌سازی

// ایجاد آرشیو zip بدون فشرده‌سازی فایل‌ها
using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
{
    FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
    FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");

    using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
    {
        archive.CreateEntry("alice29.txt", fi1);
        archive.CreateEntry("lcet10.txt", fi2);
        archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
    }
}

فشرده‌سازی ZIP با رمز عبور در C#

using (var archive = new Archive(new ArchiveEntrySettings(encryptionSettings: new TraditionalEncryptionSettings("pass"))))
{
    archive.CreateEntry("entry_name1.dat", "input_file1.dat");
    archive.CreateEntry("entry_name2.dat", "input_file2.dat");
    archive.Save("result_archive.zip");
}

پارامتر encryptionSettings برای ایجاد یک آرشیو ZIP محافظت‌شده با رمز عبور استفاده می‌شود.

استخراج ZIP با رمز عبور در C#

using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
    archive.ExtractToDirectory("\\outputDirectory");
}

کلاس ArchiveLoadOptions با مقدار ویژگی DecryptionPassword برای باز کردن آرشیو ZIP محافظت‌شده با رمز عبور به کار می‌رود.

برای مشاهده مثال‌های کامل و فایل‌های داده، لطفاً به https://github.com/aspose-zip/Aspose.ZIP-for-.NET مراجعه کنید.

استفاده از فشرده‌سازی LZMA درون آرشیو ZIP

الگوریتم زنجیره‌ای لِمپِل‑زیو‑مارکوف (LZMA) برای انجام فشرده‌سازی بدون اتلاف داده به کار می‌رود. LZMA از الگوریتم فشرده‌سازی دیکشنری استفاده می‌کند؛ جریان فشرده‌شده یک جریان بیت است. فشرده‌سازی LZMA درون آرشیو ZIP امکان افزودن ورودی‌های فشرده‌شده با LZMA را به کانتینرهای ZIP می‌دهد. مثال زیر پیاده‌سازی فشرده‌سازی LZMA با استفاده از Aspose.ZIP API را نشان می‌دهد.

using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
{
    using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
    {
        archive.CreateEntry("sample.txt", dataDir + "sample.txt");
        archive.Save(zipFile);
    }
}

استفاده از فشرده‌سازی BZip2 درون آرشیو ZIP

bzip2 یک برنامه رایگان و منبع باز برای فشرده‌سازی فایل‌هاست که از الگوریتم بوروز‑ویلر استفاده می‌کند. این ابزار فقط فایل‌های تک‌تکه را فشرده می‌کند و یک بایگانی‌کننده فایل نیست. این برنامه توسط جولیان سوئرد توسعه یافته و توسط مارک ویلارد و میکا اسنایدر نگهداری می‌شود. کد زیر پیاده‌سازی فشرده‌سازی BZip2 با استفاده از Aspose.ZIP API را نشان می‌دهد.

using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
{
    using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
    {
        archive.CreateEntry("sample.txt", dataDir + "sample.txt");
        archive.Save(zipFile);
    }
}

استفاده از فشرده‌سازی PPMd درون آرشیو ZIP

پیش‌بینی بر پایه تطبیق جزئی (PPM) یک تکنیک فشرده‌سازی آماری تطبیقی است که بر پایه مدل‌سازی زمینه و پیش‌بینی عمل می‌کند. مدل‌های PPM از مجموعه‌ای از نمادهای قبلی در جریان نمادهای فشرده‌نشده برای پیش‌بینی نماد بعدی استفاده می‌کنند. الگوریتم‌های PPM می‌توانند برای خوشه‌بندی داده‌ها به گروه‌های پیش‌بینی‌شده در تحلیل خوشه‌ای نیز به کار روند. کد زیر پیاده‌سازی فشرده‌سازی PPMd با استفاده از Aspose.ZIP API را نشان می‌دهد.

using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
{
    using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
    {
        archive.CreateEntry("sample.txt", dataDir + "sample.txt");
        archive.Save(zipFile);
    }
}

استخراج آرشیو با یک فایل

using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
{
    using (Archive archive = new Archive(fs))
    {
        int percentReady = 0;
        archive.Entries[0].ExtractionProgressed += (s, e) =>
        {
            int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
            if (percent > percentReady)
            {
                Console.WriteLine(string.Format("{0}% decompressed", percent));
                percentReady = percent;
            }
        };
        archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
    }
}

استخراج آرشیو با چندین فایل

using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
{
    StringBuilder sb = new StringBuilder("Entries are: ");
    int percentReady = 0;
    using (Archive archive = new Archive(zipFile,
        new ArchiveLoadOptions()
        {
            EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
            EntryExtractionProgressed = (s, e) =>
            {
                int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
                if (percent > percentReady)
                {
                    Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
                }
            }
        }))
    {
        Console.WriteLine(sb.ToString(0, sb.Length - 2));
        using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
        {
            using (var decompressed = archive.Entries[0].Open())
            {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
                {
                    extracted.Write(buffer, 0, bytesRead);
                }
                // خواندن از جریان استخراج‌شده به فایل هدف.
            }
        }
        percentReady = 0;
        archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
    }
}

استخراج آرشیو ذخیره‌شده بدون فشرده‌سازی

using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
{
    using (Archive archive = new Archive(zipFile))
    {
        using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
        {
            using (var decompressed = archive.Entries[0].Open())
            {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
                {
                    extracted.Write(buffer, 0, bytesRead);
                }
                // خواندن از جریان استخراج‌شده به فایل هدف.
            }
        }

        using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
        {
            using (var decompressed = archive.Entries[1].Open())
            {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
                {
                    extracted.Write(buffer, 0, bytesRead);
                }
                // خواندن از جریان استخراج‌شده به فایل هدف.
            }
        }
    }
}

برای مشاهده مثال‌های کامل و فایل‌های داده، لطفاً به https://github.com/aspose-zip/Aspose.ZIP-for-.NET مراجعه کنید.