База знания

Компресиране и разархивиране на файлове с C# – Компресиране и декомпресиране

Какво е ZIP (формат на файл)

ZIP е архивен файлов формат, който поддържа беззагубно компресиране на данни. ZIP файл може да съдържа един или повече файлове или директории, които са компресирани. ZIP файловете обикновено използват разширенията .zip или .ZIP и MIME тип application/zip. Много програми използват 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))
        {
            //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#

Разликата между компресирането на един файл и на множество файлове е, че трябва да заредим повече файлове в FileStream и да ги добавим всички в ZIP архива, използвайки метода Archive.CreateEntry("FileName", FileStream).

Следният кодов фрагмент показва как да добавим множество файлове в ZIP, използвайки 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" });
		            	}
		        }
	        }
        }

Компресиране на файлове с клас FileInfo

Файловете могат да се заредят и чрез класа FileInfo и след това да се добавят към ZIP архива по същия начин, както преди.

Класът FileInfo предоставя свойства и методи за създаване, копиране, изтриване, преместване и отваряне на файлове, както и помага при създаването на обекти 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 });
	        }
    }

Съхраняване на файлове в архиви без компресия

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

Как да създадем 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 (LZMA) е алгоритъм за беззагубно компресиране на данни. LZMA използва алгоритъм за компресиране на речник, а компресираният поток е поток от битове. Компресията LZMA в ZIP архива позволява контейнерите 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 архив

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

За пълни примери и файлове с данни, моля, посетете https://github.com/aspose-zip/Aspose.ZIP-for-.NET .