Vidensbase

Zip eller pak filer ud med C# - Filkomprimering og dekomprimering

Hvad er ZIP (filformat)

ZIP er et arkivfilformat, der understøtter tabsfri datakomprimering. En ZIP‑fil kan indeholde én eller flere filer eller mapper, som er blevet komprimeret. ZIP‑filer bruger typisk filendelserne .zip eller .ZIP og MIME‑medietypen application/zip. ZIP anvendes som grundlæggende filformat af mange programmer, ofte under et andet navn. Når man navigerer i et filsystem via en brugergrænseflade, vises grafiske ikoner, der repræsenterer ZIP‑filer, ofte som et dokument eller et andet objekt med en tydelig lynlås.

Der findes flere måder at zippe (komprimere) filer på , afhængigt af hvilket operativsystem du bruger. Og næsten hver dag skal vi zippe eller pakke nogle filer ud og overføre dem til en lagringsserver eller en fildelingsplatform. Heldigvis kan vi automatisere denne proces ved hjælp af Aspose.ZIP API . Det giver dig mulighed for at komprimere og dekomprimere filer uden at bekymre dig om den underliggende filstruktur. Denne artikel viser, hvordan du arbejder med både enkelt‑ og flere‑fil‑komprimering. Aspose.ZIP‑pakken kan tilføjes til dit .NET‑projekt ved hjælp af følgende NuGet‑kommando:

PM> Install-Package Aspose.Zip

Sådan komprimeres en enkelt fil med C#

  1. Først skal vi oprette et objekt af FileStream class til output‑ZIP‑arkivet
  2. Indlæs en enkelt fil i FileStream -objektet
  3. Opret et objekt af Archive class
  4. Tilføj filen til arkivet ved hjælp af Archive.CreateEntry ‑metoden (“FileName”, FileStream).
  5. Opret ZIP‑arkivet ved hjælp af Archive.Save ‑metoden (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);
                }
            }
        }

Komprimering af flere filer med C#

Forskellen mellem at komprimere en enkelt fil og flere filer er, at vi skal indlæse flere filer i FileStream og tilføje dem alle til ZIP‑arkivet ved hjælp af metoden Archive.CreateEntry("FileName", FileStream).
Følgende kodeudsnit viser, hvordan du tilføjer flere filer til ZIP ved hjælp af 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" });
		            	}
		        }
	        }
        }

Komprimer filer ved hjælp af FileInfo‑klassen

Filer kan også indlæses ved hjælp af FileInfo‑klassen og derefter tilføjes til ZIP‑arkivet på samme måde som før.
FileInfo‑klassen giver egenskaber og instansmetoder til oprettelse, kopiering, sletning, flytning og åbning af filer samt hjælper med oprettelse af FileStream‑objekter.

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

Gem filer i arkiver uden komprimering

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

Sådan ZIP‑filer med adgangskode i 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‑parameteren bruges til at oprette et adgangskodebeskyttet ZIP‑arkiv.

Sådan UNZIP‑filer med adgangskode i C#

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

ArchiveLoadOptions med DecryptionPassword‑egenskaben bruges til at åbne et adgangskodebeskyttet ZIP‑arkiv.
For at se komplette eksempler og datafiler, gå til https://github.com/aspose-zip/Aspose.ZIP-for-.NET .

Brug af LZMA‑komprimering i ZIP‑arkiv

Lempel–Ziv–Markov‑kæde‑algoritmen (LZMA) er en algoritme, der anvendes til tabsfri datakomprimering. LZMA bruger en ordbogs‑komprimeringsalgoritme, hvor den komprimerede strøm er en bit‑strøm. LZMA‑komprimering i ZIP‑arkivet gør det muligt for ZIP‑containere at indeholde LZMA‑komprimerede poster. Følgende kodeeksempel viser implementeringen af LZMA‑komprimering ved hjælp af 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);
    }
}

Brug af BZip2‑komprimering i ZIP‑arkiv

bzip2 er et gratis og open‑source filkomprimeringsprogram, der bruger Burrows–Wheeler‑algoritmen. Det komprimerer kun enkeltfiler og er ikke et filarkiveringsværktøj. Det blev udviklet af Julian Seward og vedligeholdes af Mark Wielaard og Micah Snyder. Følgende kodeudsnit viser implementeringen af BZip2‑komprimering ved hjælp af 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);
    }
}

Brug af PPMd‑komprimering i ZIP‑arkiv

Prediction by partial matching (PPM) er en adaptiv statistisk datakomprimeringsteknik baseret på kontekst‑modellering og forudsigelse. PPM‑modeller bruger et sæt af tidligere symboler i den ukomprimerede symbolstrøm til at forudsige det næste symbol i strømmen. PPM‑algoritmer kan også anvendes til at gruppere data i forudsagte grupper i klyngeanalyse. Følgende kodeudsnit viser implementeringen af PPMd‑komprimering ved hjælp af 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);
    }
}

Dekomprimer arkiv med enkelt fil

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

Dekomprimer arkiv med flere filer

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

Udtræk gemt arkiv uden komprimering

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

For at se komplette eksempler og datafiler, gå til https://github.com/aspose-zip/Aspose.ZIP-for-.NET