Basis Pengetahuan

Mengompres atau mengekstrak file menggunakan C# - Kompresi dan dekompresi file

Apa itu ZIP (Format File)

ZIP adalah format file arsip yang mendukung kompresi data lossless. Sebuah file ZIP dapat berisi satu atau lebih file atau direktori yang telah dikompres. File ZIP biasanya menggunakan ekstensi .zip atau .ZIP dan tipe media MIME application/zip. ZIP digunakan sebagai format file dasar oleh banyak program, biasanya dengan nama yang berbeda. Saat menavigasi sistem file melalui antarmuka pengguna, ikon grafis yang mewakili file ZIP sering muncul sebagai dokumen atau objek lain yang menonjolkan gambar ritsleting.

Ada berbagai cara untuk mengompres (zip) file , tergantung pada sistem operasi yang Anda gunakan. Dan hampir setiap hari, kita harus mengompres atau mengekstrak beberapa file dan mengirimkannya ke server penyimpanan atau platform berbagi file. Untungnya, proses ini dapat diotomatisasi menggunakan Aspose.ZIP API . API ini memungkinkan Anda mengompres dan mendekompres file tanpa harus khawatir tentang struktur file yang mendasarinya. Artikel ini menunjukkan cara bekerja dengan kompresi file tunggal maupun banyak file.

Paket Aspose.ZIP dapat ditambahkan ke proyek .NET Anda dengan perintah NuGet berikut:

PM> Install-Package Aspose.Zip

Cara mengompres satu file dengan C#

  1. Pertama, buat objek dari kelas FileStream untuk arsip ZIP keluaran.
  2. Muat satu file ke dalam objek FileStream .
  3. Buat objek dari kelas Archive .
  4. Tambahkan file ke arsip menggunakan metode Archive.CreateEntry (“FileName”, FileStream).
  5. Buat arsip ZIP menggunakan metode Archive.Save (FileStream).
        using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
        {
            //File to be added to archive
            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);
                }
            }
        }

Mengompres banyak file dengan C#

Perbedaan antara mengompres satu file dan banyak file adalah bahwa kita harus memuat lebih banyak file ke dalam FileStream dan menambahkannya semua ke arsip ZIP menggunakan metode Archive.CreateEntry("FileName", FileStream).
Potongan kode berikut menunjukkan cara menambahkan banyak file ke ZIP menggunakan FileStream.

        // Create FileStream for output ZIP archive
        using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
        {
	        // File to be added to archive
	        using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	            {
		            // File to be added to archive
		            using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
		        {
			        using (var archive = new Archive())
			            {
				            // Add files to the archive
				            archive.CreateEntry("alice29.txt", source1);
				            archive.CreateEntry("asyoulik3.txt", source2);
				            // ZIP the files
				            archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
		            	}
		        }
	        }
        }

Mengompres file menggunakan Kelas FileInfo

File juga dapat dimuat menggunakan kelas FileInfo dan kemudian ditambahkan ke arsip ZIP dengan cara yang sama seperti sebelumnya.
Kelas FileInfo menyediakan properti dan metode instance untuk pembuatan, penyalinan, penghapusan, pemindahan, dan pembukaan file, serta membantu dalam pembuatan objek FileStream.

    using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
    {
	    // Files to be added to archive
	    FileInfo fi1 = new FileInfo("alice29.txt");
	    FileInfo fi2 = new FileInfo("fields.c");
	    using (var archive = new Archive())
	        {
		        // Add files to the archive
		        archive.CreateEntry("alice29.txt", fi1);
		        archive.CreateEntry("fields.c", fi2);
		        // Create ZIP archive
		        archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
	        }
    }

Menyimpan File ke Arsip tanpa Kompresi

    //Creates zip archive without compressing files
    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 file dengan kata sandi di 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 membuat arsip ZIP yang dilindungi kata sandi.

Cara UNZIP file dengan kata sandi di C#

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

ArchiveLoadOptions dengan properti DecryptionPassword digunakan untuk membuka arsip ZIP yang dilindungi kata sandi.

Untuk contoh lengkap dan file data, silakan kunjungi https://github.com/aspose-zip/Aspose.ZIP-for-.NET .

Menggunakan Kompresi LZMA dalam Arsip ZIP

Algoritma Lempel–Ziv–Markov chain (LZMA) adalah algoritma yang digunakan untuk melakukan kompresi data lossless. LZMA menggunakan algoritma kompresi berbasis kamus, sehingga aliran terkompresi berupa aliran bit. Kompresi LZMA dalam arsip ZIP memungkinkan kontainer ZIP berisi entri yang terkompresi LZMA. Contoh kode berikut menunjukkan implementasi kompresi 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 Kompresi BZip2 dalam Arsip ZIP

bzip2 adalah program kompresi file gratis dan sumber terbuka yang menggunakan algoritma Burrows–Wheeler. Program ini hanya mengompres file tunggal dan bukan arsip file. bzip2 dikembangkan oleh Julian Seward, serta dipelihara oleh Mark Wielaard dan Micah Snyder. Potongan kode berikut menunjukkan implementasi kompresi 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 Kompresi PPMd dalam Arsip ZIP

Prediction by partial matching (PPM) adalah teknik kompresi data statistik adaptif berbasis pemodelan konteks dan prediksi. Model PPM menggunakan sekumpulan simbol sebelumnya dalam aliran simbol yang belum dikompres untuk memprediksi simbol berikutnya dalam aliran tersebut. Algoritma PPM juga dapat digunakan untuk mengelompokkan data ke dalam grup yang diprediksi dalam analisis klaster. Potongan kode berikut menunjukkan implementasi kompresi 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);
    }
}

Mendekompres Arsip dengan Satu File

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

Mendekompres Arsip dengan Banyak File

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);
                }
                // Read from decompressed stream to extracting file.
            }
        }
        percentReady = 0;
        archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
    }
}

Mengekstrak Arsip yang Disimpan tanpa Kompresi

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);
                }
                // Read from decompressed stream to extracting file.
            }
        }

        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);
                }
                // Read from decompressed stream to extracting file.
            }
        }
    }
}

Untuk contoh lengkap dan file data, silakan kunjungi https://github.com/aspose-zip/Aspose.ZIP-for-.NET .