Base de connaissances

Compresser ou décompresser des fichiers avec C# - Compression et décompression de fichiers

Qu’est-ce que le format ZIP (Fichier)

ZIP est un format de fichier d’archive qui prend en charge la compression de données sans perte. Un fichier ZIP peut contenir un ou plusieurs fichiers ou répertoires qui ont été compressés. Les fichiers ZIP utilisent généralement les extensions .zip ou .ZIP et le type MIME application/zip. ZIP est utilisé comme format de base par de nombreux programmes, souvent sous un autre nom. Lors de la navigation dans un système de fichiers via une interface utilisateur, les icônes graphiques représentant les fichiers ZIP apparaissent souvent comme un document ou un autre objet mettant en avant un zippeur.

Il existe plusieurs façons de compresser (zipper) des fichiers , selon le système d’exploitation que vous utilisez. Et presque chaque jour, nous devons zipper ou dézipper des fichiers et les transférer vers un serveur de stockage ou une plateforme de partage de fichiers. Heureusement, nous pouvons automatiser ce processus en utilisant Aspose.ZIP API . Elle vous permet de compresser et décompresser des fichiers sans vous soucier de la structure sous-jacente. Cet article montre comment travailler avec la compression d’un seul fichier ainsi que de plusieurs fichiers.

Le package Aspose.ZIP peut être ajouté à votre projet .NET avec la commande NuGet suivante :

PM> Install-Package Aspose.Zip

Comment compresser un fichier unique avec C#

  1. Tout d’abord, nous devons créer un objet de la classe FileStream pour l’archive ZIP de sortie
  2. Charger un fichier unique dans l’objet FileStream
  3. Créer un objet de la classe Archive
  4. Ajouter le fichier à l’archive en utilisant la méthode Archive.CreateEntry ( “FileName”, FileStream).
  5. Créer l’archive ZIP en utilisant la méthode 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);
                }
            }
        }

Compression de plusieurs fichiers avec C#

La différence entre la compression d’un seul fichier et celle de plusieurs fichiers réside dans le fait que nous devons charger davantage de fichiers dans le FileStream et les ajouter tous à l’archive ZIP en utilisant la méthode Archive.CreateEntry("FileName", FileStream).

Le fragment de code suivant montre comment ajouter plusieurs fichiers dans le ZIP à l’aide de 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" });
		            	}
		        }
	        }
        }

Compresser des fichiers avec la classe FileInfo

Les fichiers peuvent également être chargés à l’aide de la classe FileInfo et ajoutés ensuite à l’archive ZIP de la même façon qu’auparavant.
La classe FileInfo fournit des propriétés et des méthodes d’instance pour la création, la copie, la suppression, le déplacement et l’ouverture de fichiers, et facilite la création d’objets 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 });
	        }
    }

Stocker des fichiers dans des archives sans compression

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

Comment zipper des fichiers avec mot de passe en 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");
    }

Le paramètre encryptionSettings est utilisé pour créer une archive ZIP protégée par mot de passe.

Comment dézipper des fichiers avec mot de passe en C#

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

La propriété DecryptionPassword de ArchiveLoadOptions est utilisée pour ouvrir une archive ZIP protégée par mot de passe.

Pour voir des exemples complets et les fichiers de données, veuillez vous rendre sur https://github.com/aspose-zip/Aspose.ZIP-for-.NET .

Utilisation de la compression LZMA dans une archive ZIP

L’algorithme Lempel–Ziv–Markov chain (LZMA) est un algorithme utilisé pour effectuer une compression de données sans perte. LZMA utilise un algorithme de compression par dictionnaire, le flux compressé étant une suite de bits. La compression LZMA au sein d’une archive ZIP permet aux conteneurs ZIP de contenir des entrées compressées en LZMA. L’exemple de code suivant montre l’implémentation de la compression LZMA à l’aide de 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);
    }
}

Utilisation de la compression BZip2 dans une archive ZIP

bzip2 est un programme de compression de fichiers gratuit et open‑source qui utilise l’algorithme de Burrows–Wheeler. Il ne compresse que des fichiers uniques et n’est pas un archiviste de fichiers. Il a été développé par Julian Seward, et maintenu par Mark Wielaard et Micah Snyder. Le fragment de code suivant montre l’implémentation de la compression BZip2 à l’aide de 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);
    }
}

Utilisation de la compression PPMd dans une archive ZIP

La prédiction par correspondance partielle (PPM) est une technique de compression de données statistique adaptative basée sur la modélisation de contexte et la prédiction. Les modèles PPM utilisent un ensemble de symboles précédents dans le flux de symboles non compressés pour prédire le symbole suivant. Les algorithmes PPM peuvent également être utilisés pour regrouper des données en groupements prédits dans l’analyse de clusters. Le fragment de code suivant montre l’implémentation de la compression PPMd à l’aide de 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);
    }
}

Décompresser une archive avec un seul fichier

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

Décompresser une archive avec plusieurs fichiers

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

Extraire une archive stockée sans compression

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

Pour des exemples complets et les fichiers de données, veuillez vous rendre sur https://github.com/aspose-zip/Aspose.ZIP-for-.NET .