Bilgi Bankası

C# ile dosyaları zipleyin veya zipten çıkarın - Dosya sıkıştırma ve açma

ZIP (Dosya formatı) Nedir

ZIP, kayıpsız veri sıkıştırmasını destekleyen bir arşiv dosya formatıdır. Bir ZIP dosyası, sıkıştırılmış bir veya daha fazla dosya ya da dizin içerebilir. ZIP dosyaları genellikle .zip veya .ZIP uzantılarını ve application/zip MIME tipini kullanır. ZIP, birçok program tarafından farklı bir ad altında temel dosya formatı olarak kullanılır. Bir dosya sisteminde kullanıcı arayüzü üzerinden gezinirken, ZIP dosyalarını temsil eden grafik simgeler genellikle bir belge ya da fermuar simgesi gibi belirgin bir nesne olarak gösterilir.
Dosyaları ziplemenin (sıkıştırmanın) birden fazla yolu vardır; hangi işletim sistemini kullandığınıza bağlıdır. Neredeyse her gün bazı dosyaları zipleyip zipten çıkarıp bir depolama sunucusuna ya da dosya paylaşım platformuna göndermemiz gerekir. Neyse ki bu süreci Aspose.ZIP API kullanarak otomatikleştirebiliriz. Bu API, dosyaları temel dosya yapısını düşünmeden sıkıştırıp açmanıza olanak tanır. Bu makale, tek ve birden fazla dosya sıkıştırma işlemlerinin nasıl yapılacağını gösterir.

Aspose.ZIP paketini .NET projenize aşağıdaki NuGet komutuyla ekleyebilirsiniz:

PM> Install-Package Aspose.Zip

C# ile tek dosyayı nasıl sıkıştırabilirsiniz

  1. İlk olarak çıktı ZIP arşivi için bir FileStream sınıfı nesnesi oluşturmamız gerekir.
  2. Tek bir dosyayı FileStream nesnesine yükleyin.
  3. Archive sınıfının bir nesnesini oluşturun.
  4. Dosyayı, Archive.CreateEntry("FileName", FileStream) yöntemiyle arşive ekleyin.
  5. [Archive.Save](https://reference.aspose.com/zip/net/aspose.zip/archive/save/#save)(FileStream) yöntemiyle ZIP arşivini oluşturun.
        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);
                }
            }
        }

C# ile birden fazla dosyayı sıkıştırma

Tek bir dosya ile birden fazla dosyayı sıkıştırma arasındaki fark, daha fazla dosyayı FileStream’e yükleyip hepsini Archive.CreateEntry("FileName", FileStream) yöntemiyle ZIP arşivine eklememiz gerektiğidir.
Aşağıdaki kod örneği, FileStream kullanarak birden fazla dosyanın ZIP arşivine nasıl ekleneceğini gösterir.

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

FileInfo Sınıfı Kullanarak Dosyaları Sıkıştırma

Dosyalar, FileInfo sınıfı kullanılarak da yüklenebilir ve daha önceki gibi ZIP arşivine eklenebilir.
FileInfo sınıfı, dosyaların oluşturulması, kopyalanması, silinmesi, taşınması ve açılması için özellikler ve örnek yöntemler sağlar; ayrıca FileStream nesnelerinin oluşturulmasına yardımcı olur.

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

Dosyaları Sıkıştırma Olmadan Arşivlere Depolama

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

C# ile şifreli ZIP dosyaları oluşturma

    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 parametresi, şifre korumalı bir ZIP arşivi oluşturmak için kullanılır.

C# ile şifreli ZIP dosyalarını açma

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

ArchiveLoadOptions içindeki DecryptionPassword özelliği, şifre korumalı bir ZIP arşivini açmak için kullanılır.
Tam örnekler ve veri dosyaları için lütfen https://github.com/aspose-zip/Aspose.ZIP-for-.NET adresine gidin.

ZIP Arşivinde LZMA Sıkıştırması Kullanma

Lempel–Ziv–Markov zinciri algoritması (LZMA), kayıpsız veri sıkıştırması gerçekleştiren bir algoritmadır. LZMA, sözlük sıkıştırma algoritması kullanır; sıkıştırılmış akış bir bit akışıdır. ZIP arşivi içinde LZMA sıkıştırması, ZIP konteynerlerinin LZMA sıkıştırılmış girişleri içermesine olanak tanır. Aşağıdaki kod örneği, Aspose.ZIP API kullanarak LZMA sıkıştırmasının nasıl uygulanacağını gösterir.

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

ZIP Arşivinde BZip2 Sıkıştırması Kullanma

bzip2, Burrows–Wheeler algoritmasını kullanan ücretsiz ve açık kaynaklı bir dosya sıkıştırma programıdır. Yalnızca tek dosyaları sıkıştırır ve bir dosya arşivleyici değildir. Julian Seward tarafından geliştirilmiş, Mark Wielaard ve Micah Snyder tarafından sürdürülmektedir. Aşağıdaki kod örneği, Aspose.ZIP API kullanarak BZip2 sıkıştırmasının nasıl uygulanacağını gösterir.

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

ZIP Arşivinde PPMd Sıkıştırması Kullanma

Kısmi eşleşmeye dayalı tahmin (PPM), bağlam modellemesi ve tahmine dayalı uyarlanabilir istatistiksel bir veri sıkıştırma tekniğidir. PPM modelleri, sıkıştırılmamış sembol akışındaki önceki sembollerin bir kümesini kullanarak akıştaki bir sonraki sembolü tahmin eder. PPM algoritmaları ayrıca kümeleme analizinde verileri tahmini gruplara ayırmak için kullanılabilir. Aşağıdaki kod örneği, Aspose.ZIP API kullanarak PPMd sıkıştırmasının nasıl uygulanacağını gösterir.

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

Tek Dosya ile Arşivi Açma

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

Birden Fazla Dosya ile Arşivi Açma

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

Sıkıştırma Olmadan Depolanmış Arşivi Çıkarma

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.
            }
        }
    }
}

Tam örnekler ve veri dosyaları için lütfen https://github.com/aspose-zip/Aspose.ZIP-for-.NET adresine gidin.