Βάση γνώσεων

Συμπίεση ή αποσυμπίεση αρχείων με C# - Συμπίεση και αποσυμπίεση αρχείων

Τι είναι το ZIP (μορφή αρχείου)

Το ZIP είναι μια μορφή αρχείου αρχειοθέτησης που υποστηρίζει συμπίεση δεδομένων χωρίς απώλειες. Ένα αρχείο ZIP μπορεί να περιέχει ένα ή περισσότερα αρχεία ή καταλόγους που έχουν συμπιεστεί. Τα αρχεία ZIP συνήθως χρησιμοποιούν τις επεκτάσεις .zip ή .ZIP και τον τύπο MIME application/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");
    }

Η ιδιότητα DecryptionPassword του ArchiveLoadOptions χρησιμοποιείται για το άνοιγμα ενός ZIP αρχείου προστατευμένου με κωδικό πρόσβασης.
Για πλήρη παραδείγματα και αρχεία δεδομένων, επισκεφθείτε το https://github.com/aspose-zip/Aspose.ZIP-for-.NET .

Χρήση συμπίεσης LZMA μέσα σε αρχείο ZIP

Ο αλγόριθμος Lempel–Ziv–Markov chain (LZMA) είναι ένας αλγόριθμος που χρησιμοποιείται για απώλεια‑απώλειας συμπίεση δεδομένων. Το LZMA χρησιμοποιεί αλγόριθμο συμπίεσης λεξικού· το συμπιεσμένο ρεύμα είναι μια σειρά bits. Η συμπίεση LZMA μέσα σε αρχείο ZIP επιτρέπει στα containers 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

Η πρόβλεψη με μερική αντιστοίχηση (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