devstory

Compression et décompression dans C#

View more Tutorials:

1- La hiérarchie des classes

Ci- dessous sont lq liste des classes qui utilisent pour compresser ou extraire le fichier. Elles se trouvent dans l'espace- nom System.IO.Compression.
ClasseDescription
ZipFileFournit des méthodes statiques pour créer, extraire et ouvrir des archives zip.
ZipArchiveReprésente un paquet de fichiers compressés dans le format d'archive ZIP.
ZipArchiveEntryReprésente un fichier compressé dans une archive ZIP.
DeflateStreamFournit des méthodes et des propriétés pour compresser et décompresser des flux à l'aide de l'algorithme Deflate.
GZipStreamFournit des méthodes et des propriétés utilisées pour compresser et décompresser les flux (stream).
Notez que cette classe est introduite dans C#  à partir de la version 4.5, donc votre projet doit utiliser .NET avec la version 4.5 ou la version plus avancée.
 

2- ZipFile

La classe ZipFile est une classe d'utilitaire. Elle comprend plusieurs méthodes  statiques qui vous aide d'ouvrir le fichier zip, d'extraire des données, ou dans la situation où un répertoire est compressé dans un fichier zip, d'extraire le fichier zip dans un dossier, ..
Le simple exemple ci- dessous utilise la méthode de la classe ZipFile pour compresser un fichier dans un fichier zip et après d'extraire ce fichier à un fichier nouveau.
ZipDirectoryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;

namespace CompressionTutorial
{
    class ZipDirectoryDemo
    {
        public static void Main(string[] args)
        {
            // Le dossier sera compressé.
            string inputDir = "C:/test/inputdir";

            // Le fichier de sortie après avoir compressé le dossier ci-dessus.
            string zipPath = "C:/test/data.zip";

            // Décompressez le fichier zip dans le dossier.
            string extractPath = "C:/test/outputdir";

            // Créez un fichier zip en compressant un dossier.
            ZipFile.CreateFromDirectory(inputDir, zipPath);

            // Décompressez le fichier zip dans le dossier.
            ZipFile.ExtractToDirectory(zipPath, extractPath);

            Console.WriteLine("Done!");
        }
    }

}
Si vous recevez un message d'erreur: "The name 'ZipFile' does not exist in the current context" (Malgré que vous avez déclaré using System.IO.Compression) ça signifie que votre projet utilise l'ancien .NET 4.5 ou le programme ne trouve pas la bibliothèuque DLL. Vous pouvez voir comment fixer cet erreur dans l'annexe à la fin de ce document.
Exécutez l'exemple et recevez les résultats:
  • data.zip

3- ZipArchive

ZipArchive représente un ensemble de fichiers qui sont compressés dans un fichier sous format ZIP.  Vous pouvez créer l'objet ZipArchive à travers la méthode OpenRead de classe ZipFile. Via ZipArchive vous pouvez lire les sous- fichiers qui sont compressés dans le fichier zip.
L'exemple ci- dessous énumère des fichiers ZipArchiveEntry qui ont compris dans le fichier zip.
ListArchiveEntryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;
using System.IO; 

namespace CompressionTutorial
{
    class ListArchiveEntryDemo
    {

        public static void Main(string[] args)
        {
            string zipPath =  "c:/test/data.zip"; 

            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                // Récupérez la liste des ZipArchiveEntry.
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    Console.WriteLine("Entry:");
                    Console.WriteLine("  Name = " + entry.Name);
                    Console.WriteLine("  FullName = " + entry.FullName);
                }
            }

            Console.Read();
        }
    }

}
Exécution l'exemple:
Extrayez des fichiers des données dans le fichier zip:
ExtractDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;
using System.IO;

namespace CompressionTutorial
{
    class ExtractDemo {
        static void Main(string[] args)
        {
            string zipPath = "c:/test/data.zip";

            // Le répertoire de sortie pour décompresser.
            string extractPath = "c:/test/extract";

            // S'il n'existe pas, créez-le.
            if (!Directory.Exists(extractPath))
            {
                System.IO.Directory.CreateDirectory(extractPath);
            }

            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    Console.WriteLine("Found: " + entry.FullName);

                    // Trouvez les entrées se termine par .docx
                    if (entry.FullName.EndsWith(".docx", StringComparison.OrdinalIgnoreCase))
                    {
                        // Par exemple : documents/Dotnet.docx
                        Console.WriteLine(" - Extract entry: " + entry.FullName);

                        // C:/test/extract/documents/Dotnet.docx  ...
                        string entryOuputPath = Path.Combine(extractPath, entry.FullName);

                        Console.WriteLine(" - Entry Ouput Path: " + entryOuputPath);

                        FileInfo fileInfo = new FileInfo(entryOuputPath);

                        // Assurez-vous que le répertoire contenant ce fichier existe.
                        // à savoir : C:/test/extract/documents
                        fileInfo.Directory.Create();

                        // Remplacez l'ancien fichier s'il existe déjà.
                        entry.ExtractToFile(entryOuputPath,true);
                    }
                }
            }

            Console.ReadLine();
        }
    }

}
Exécutez l'exemple:
Vous pouvez mettre les fichiers dans un fichier zip disponible.
AddEntryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;
using System.IO;

namespace CompressionTutorial
{
    class AddEntryDemo
    {
        static void Main(string[] args)
        {
            string zipPath = "C:/test/data.zip";

            // Ouvrir le flux (stream) pour lire le fichier zip.
            using (FileStream zipStream = new FileStream(zipPath, FileMode.Open))
            {
                // Créez l'objet ZipArchive.
                using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update))
                {
                    // Ajoutez une entrée au ZipArchive.
                    ZipArchiveEntry readmeEntry = archive.CreateEntry("note/Note.txt");

                    // Créez un flux pour écrire du contenu à l'entrée.
                    using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
                    {
                        writer.WriteLine("## Note.txt");
                        writer.WriteLine("========================");
                    }
                }
            }
        }
    }

}
Exécutez l'exemple et recevez des résultats.

4- Annexe: Correction d'erreur

Si vous obtenez un message d'erreur: "The name 'ZipFile' does not exist in the current context" (Bien que vous avez déclaré d'utiliser System.IO.Compression), ce qui signifie que votre projet utilisant l'ancien .NET 4.5 ou le programme ne trouve pas la bibliothèque DLL nécessaire.
Cliquez sur le bouton droit du Projet, sélectionnez Properties, assurez vous que votre projet utilise la version .NET Framework 4.5 ou la version plus avancée.
Réexécutez votre classe et voir si l'interprète n'a des erreurs ou pas. Au cas où il y a encore des notifications des erreurs, vous devez désigner la location de la bibliothèque DLL.
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.IO.Compression.FileSystem.dll
Cliquez sur le bouton droit du Projet et sélectionnez:
  • Add/Reference..
Sélectionnez le fichier:
  • System.IO.Compression.FileSystem.dll
De la même façon, si vous recevez la notification "The name 'ZipArchive' does not exist in the current context" (Même si vous avez déclaré using System.IO.Compression) vous devez déclarer l'utilisation de la bibliothèque System.IO.Compression.dll:
De la même façon, si vous recevez la notification "The name 'Path' does not exist in the current context" (Malgré que vous avez déclaré using System.IO) vous devez déclarer l'utilisation de la bibliothèque mscorlib.dll:

View more Tutorials:

Peut-être que vous êtes intéressé

Voici des leçons en ligne à part du site web o7planning que nous recommandons. La liste comprend des leçons en ligne et celles en promo.