Pangkalan Pengetahuan

Mengepam atau mengekstrak fail menggunakan C# - Pemampatan dan penyahmampatan fail

Apa itu ZIP (Format Fail)

ZIP ialah format fail arkib yang menyokong pemampatan data tanpa kehilangan. Fail ZIP boleh mengandungi satu atau lebih fail atau direktori yang telah dimampatkan. Fail ZIP biasanya menggunakan sambungan fail .zip atau .ZIP dan jenis MIME application/zip. ZIP digunakan sebagai format fail asas oleh banyak program, biasanya dengan nama yang berbeza. Apabila menavigasi sistem fail melalui antara muka pengguna, ikon grafik yang mewakili fail ZIP sering muncul sebagai dokumen atau objek lain yang menonjolkan zip.

Terdapat pelbagai cara untuk mengepam (memampat) fail , bergantung pada sistem operasi yang anda gunakan. Dan hampir setiap hari, kita perlu mengepam atau mengekstrak beberapa fail dan memindahkannya ke pelayan storan atau platform perkongsian fail. Mujurlah, proses ini boleh diautomasikan menggunakan Aspose.ZIP API . Ia membolehkan anda memampat dan menyahmampat fail tanpa perlu risau tentang struktur fail yang mendasari. Artikel ini menunjukkan cara bekerja dengan pemampatan satu fail serta berbilang fail.

Pakej Aspose.ZIP boleh ditambah ke projek .NET anda menggunakan arahan NuGet berikut:

PM> Install-Package Aspose.Zip

Cara memampat satu fail dengan C#

  1. Pertama, kita perlu membuat objek kelas FileStream untuk arkib ZIP output.
  2. Muatkan satu fail ke dalam objek FileStream .
  3. Buat objek kelas Archive .
  4. Tambahkan fail ke dalam arkib menggunakan kaedah Archive.CreateEntry (“FileName”, FileStream).
  5. Cipta arkib ZIP menggunakan kaedah Archive.Save (FileStream).
using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
{
    // Fail yang akan ditambah ke arkib
    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);
        }
    }
}

Memampatkan berbilang fail dengan C#

Perbezaan antara memampat satu fail dan berbilang fail ialah kita perlu memuatkan lebih banyak fail ke dalam FileStream dan menambah semuanya ke dalam arkib ZIP menggunakan kaedah Archive.CreateEntry("FileName", FileStream).

Kod contoh berikut menunjukkan cara menambah berbilang fail ke dalam ZIP menggunakan FileStream.

// Cipta FileStream untuk arkib ZIP output
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
    // Fail yang akan ditambah ke arkib
    using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
    {
        // Fail yang akan ditambah ke arkib
        using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
        {
            using (var archive = new Archive())
            {
                // Tambah fail ke dalam arkib
                archive.CreateEntry("alice29.txt", source1);
                archive.CreateEntry("asyoulik3.txt", source2);
                // ZIP fail-fail tersebut
                archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
            }
        }
    }
}

Memampatkan fail menggunakan Kelas FileInfo

Fail juga boleh dimuatkan menggunakan kelas FileInfo dan kemudian ditambah ke dalam arkib ZIP dengan cara yang sama seperti sebelum ini.

Kelas FileInfo menyediakan sifat dan kaedah contoh untuk penciptaan, penyalinan, pemadaman, pemindahan, dan pembukaan fail, serta membantu dalam penciptaan objek FileStream.

using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
    // Fail-fail yang akan ditambah ke arkib
    FileInfo fi1 = new FileInfo("alice29.txt");
    FileInfo fi2 = new FileInfo("fields.c");
    using (var archive = new Archive())
    {
        // Tambah fail ke dalam arkib
        archive.CreateEntry("alice29.txt", fi1);
        archive.CreateEntry("fields.c", fi2);
        // Cipta arkib ZIP
        archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
    }
}

Menyimpan Fail ke Arkib tanpa Pemampatan

// Membuat arkib zip tanpa memampatkan fail
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 });
    }
}

Cara ZIP fail dengan kata laluan dalam 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");
}

Parameter encryptionSettings digunakan untuk mencipta arkib ZIP yang dilindungi kata laluan.

Cara UnZIP fail dengan kata laluan dalam C#

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

ArchiveLoadOptions dengan nilai sifat DecryptionPassword digunakan untuk membuka arkib ZIP yang dilindungi kata laluan.

Untuk melihat contoh lengkap dan fail data, sila lawati https://github.com/aspose-zip/Aspose.ZIP-for-.NET .

Menggunakan Pemampatan LZMA dalam Arkib ZIP

Algoritma Lempel–Ziv–Markov chain (LZMA) ialah algoritma yang digunakan untuk melakukan pemampatan data tanpa kehilangan. LZMA menggunakan algoritma pemampatan kamus, aliran terkompresi adalah aliran bit. Pemampatan LZMA dalam arkib ZIP membolehkan kontena ZIP mengandungi entri terkompresi LZMA. Contoh kod berikut menunjukkan pelaksanaan pemampatan LZMA menggunakan 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);
    }
}

Menggunakan Pemampatan BZip2 dalam Arkib ZIP

bzip2 ialah program pemampatan fail sumber terbuka yang menggunakan algoritma Burrows–Wheeler. Ia hanya memampatkan fail tunggal dan bukan arkib fail. Ia dibangunkan oleh Julian Seward, dan diselenggara oleh Mark Wielaard serta Micah Snyder. Kod contoh berikut menunjukkan pelaksanaan pemampatan BZip2 menggunakan 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);
    }
}

Menggunakan Pemampatan PPMd dalam Arkib ZIP

Prediction by partial matching (PPM) ialah teknik pemampatan data statistik adaptif berdasarkan pemodelan konteks dan ramalan. Model PPM menggunakan set simbol sebelumnya dalam aliran simbol yang tidak dimampat untuk meramalkan simbol seterusnya dalam aliran. Algoritma PPM juga boleh digunakan untuk mengklaster data ke dalam kumpulan yang diramalkan dalam analisis klaster. Kod contoh berikut menunjukkan pelaksanaan pemampatan PPMd menggunakan 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);
    }
}

Menyahmampat Arkib dengan Satu Fail

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");
    }
}

Menyahmampat Arkib dengan Berbilang Fail

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);
                }
                // Baca dari aliran terdekompresi ke fail yang diekstrak.
            }
        }
        percentReady = 0;
        archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
    }
}

Mengekstrak Arkib Disimpan tanpa Pemampatan

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);
                }
                // Baca dari aliran terdekompresi ke fail yang diekstrak.
            }
        }

        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);
                }
                // Baca dari aliran terdekompresi ke fail yang diekstrak.
            }
        }
    }
}

Untuk contoh lengkap dan fail data, sila lawati https://github.com/aspose-zip/Aspose.ZIP-for-.NET .