قاعدة المعرفة

ضغط أو فك ضغط الملفات باستخدام C# - ضغط وفك ضغط الملفات

ما هو تنسيق ZIP (ملف)

ZIP هو تنسيق ملف أرشيف يدعم ضغط البيانات بدون فقدان. قد يحتوي ملف ZIP على ملف أو أكثر أو دلائل تم ضغطها. عادةً ما تستخدم ملفات ZIP الامتدادين .zip أو .ZIP ونوع MIME هو application/zip. يُستخدم ZIP كتنسيق أساسي للملفات في العديد من البرامج، غالبًا تحت اسم مختلف. عند التنقل في نظام الملفات عبر واجهة المستخدم، تظهر أيقونات تمثّل ملفات ZIP غالبًا كوثيقة أو كائن آخر يبرز سحابًا.

هناك طرق متعددة لضغط (ضغط) الملفات ، حسب نظام التشغيل الذي تستخدمه. وفي كل يوم تقريبًا، نحتاج إلى ضغط أو فك ضغط بعض الملفات وإرسالها إلى خادم تخزين أو منصة مشاركة ملفات. لحسن الحظ، يمكننا أتمتة هذه العملية باستخدام Aspose.ZIP API . يتيح لك ضغط وفك ضغط الملفات دون القلق بشأن بنية الملفات الأساسية. تُظهر هذه المقالة كيفية التعامل مع ضغط ملف واحد وكذلك عدة ملفات.

يمكن إضافة حزمة Aspose.ZIP إلى مشروع .NET الخاص بك باستخدام أمر NuGet التالي:

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 وإضافتها جميعًا إلى أرشيف ZIP باستخدام الطريقة Archive.CreateEntry(“FileName”, FileStream).
المقتطف التالي يوضح كيفية إضافة عدة ملفات إلى ZIP باستخدام FileStream.

// إنشاء 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

خوارزمية Lempel–Ziv–Markov chain (LZMA) هي خوارزمية تُستخدم لتنفيذ ضغط بيانات بدون فقدان. يستخدم LZMA خوارزمية ضغط القاموس، وتكون الدفق المضغوط عبارة عن تدفق من البتات. يتيح ضغط LZMA داخل أرشيف ZIP إمكانية احتواء الحاويات على إدخالات مضغوطة بـ LZMA. يوضح المثال التالي تنفيذ ضغط 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 هو برنامج ضغط ملفات مجاني ومفتوح المصدر يستخدم خوارزمية Burrows–Wheeler. يضغط ملفات مفردة فقط ولا يُعد أرشيفًا للملفات. تم تطويره بواسطة Julian Seward، ويُديره Mark Wielaard و Micah Snyder. يوضح المقتطف التالي تنفيذ ضغط 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}% تم فك ضغطه", 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("الإدخالات هي: ");
    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}% تم ضغطه", 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 .