Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement de logiciels
  4. C#
  5. Les fichiers ZIP

Les fichiers ZIP

Scheduled Pinned Locked Moved C#
5 Posts 4 Posters 4.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D
    D
    davydavek
    wrote on last edited by
    #1

    <p>Comme vous le savez surement, le framework .NET est une immense collection de classes que nous, les développeurs, utilisons pour créer nos programmes. Le framework est divisé en plusieurs Namespace, celui que nous utiliserons dans ce tutoriel est <a href="http://msdn.microsoft.com/en-us/library/system.io.compression(v=vs.110).aspx" rel="external nofollow">System.IO.Compression</a>.<br/>
    Il vous faudra donc ajouter deux références (Explorateur de solution -> Références -> Ajouter Référence)<br/></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""><img alt="4e631291de.png" src="https://puu.sh/dYaA7/4e631291de.png"/></blockquote><p><br/>
    Puis vérifiez que les références ont bien été ajoutées:<br/></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""><img alt="2ac2a3d543.png" src="https://puu.sh/dYb2L/2ac2a3d543.png"/></blockquote><p><br/>
    Maintenant il ne vous reste plus qu'a ajouter un using tout en haut de votre code:</p>
    <pre class="ipsCode prettyprint lang-auto">
    using System.IO.Compression;
    </pre>
    <p>(Nous utiliserons aussi les namespaces System et Sytem.IO)<br/>
     <br/>
    Pour commencer, nous avons les fonctions de la classe statique <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v=vs.110).aspx" rel="external nofollow">ZipFile</a> :<br/>
    -Prend tout les fichiers contenus dans le dossier "folder", puis les compresses dans le fichier "compressed.zip"</p>
    <pre class="ipsCode prettyprint lang-auto">
    ZipFile.CreateFromDirectory("folder", "compressed.zip");
    </pre>
    <p>Avec l'enumeration <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v=vs.110).aspx" rel="external nofollow">CompressionLevel</a>, il est possible d'optimiser la compression, sois pour la vitesse, sois pour la taille du fichier.<br/>
    -Extrait les fichiers contenus dans le fichier "compressed.zip" vers le dossier "folder"</p>
    <pre class="ipsCode prettyprint lang-auto">
    ZipFile.ExtractToDirectory("compressed.zip", "folder");
    </pre><p>Ces deux fonctions ont une surchage qui prend en compte l'encodage, l'encodage de base est UTF-8 donc si vous avez besoin d'un encodage différent, il vous suffit de le passer en paramètre.<br/>
     <br/>
     <br/>
    Maintenant passons au choses un peu plus complexes, la classe <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive(v=vs.110).aspx" rel="external nofollow">ZipArchive</a> vas nous permettre d'avoir plus de contrôle sur notre archive. Cette classe implémente IDisposable, il faut donc l'entourer d'un bloc "using", ou manuellement appeler Dispose() quand vous avez fini de l'utiliser.<br/>
     <br/>
    Tout d'abord, pour créer une instance ZipArchive, il faut ouvrir un Stream qui va nous permettre de lire le fichier. Cet exemple ouvre le fichier "test.zip". affiche le nom de tout les fichiers ainsi que le ratio de compression:</p>
    <pre class="ipsCode prettyprint lang-auto">
    using (Stream fs = File.OpenRead("test.zip"))
    using (var archive = new ZipArchive(fs, ZipArchiveMode.Read))
    foreach (ZipArchiveEntry entry in archive.Entries)
    Console.WriteLine("{0} : {1}%", entry.Name, Math.Ceiling((double)entry.CompressedLength / (double)entry.Length * 100));
    </pre>
    <p> <br/>
    La classe ZipArchive nous permet de créer, de lire et aussi de mettre a jour des archives ZIP.<br/>
    -Création:</p>
    <pre class="ipsCode prettyprint lang-auto">
    ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Create);
    </pre>
    <p>-Lecture:</p>
    <pre class="ipsCode prettyprint lang-auto">
    ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Read);
    // equivalent
    ZipArchive archive = ZipFile.OpenRead("name.zip");
     
    </pre>
    <p>-Mise a jour:</p>
    <pre class="ipsCode prettyprint lang-auto">
    ZipArchive archive = ZipFIle.Open("name.zip", ZipArchiveMode.Update);</pre>
    <p>Dans l'archive, chaque fichier est représenter par une <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry(v=vs.110).aspx" rel="external nofollow">ZipArchiveEntry</a>, qu'on peut obtenir grâce a la proprietee Entries de la classe ZipArchive.</p>
    <p>On peut récupérer un objet ZipArchiveEntry en choisissant un existant:</p>
    <pre class="ipsCode prettyprint">
    var entry = archive.GetEntry("file.txt");
    </pre>
    <p>Ou en créant une nouvelle:</p>
    <pre class="ipsCode prettyprint">
    var entry = archive.CreateEntry("file.txt");</pre>
    <p>La classe ZipArchiveEntry contient des propriétés publiques qui exposent des informations a propos du fichier (nom, taille (et taille après compression), date de la dernière écriture ...)</p>
    <p>Elle contient aussi plusieurs fonctions tel que Delete (supprime le fichier de l'archive) et ExtractToFile(extrait le fichier compressé vers un fichier décompressé hors de l'archive).</p>
    <p> </p>
    <p>La fonction Open revois un objet Stream, qui va nous permettre de modifier directement le contenu du fichier.</p>
    <p>Exemple qui créé une archive "test.zip", et qui y ajoute le fichier "foo.txt". (c'est possible de le faire plus facilement en utilisant archive.CreateEntryFromFile, mais je vais utiliser cet exemple pour vous montrer comment utiliser l'objet Stream):</p>
    <pre class="ipsCode prettyprint">
                using (ZipArchive archive = ZipFile.Open("test.zip", ZipArchiveMode.Create))
                {
                    var entry = archive.CreateEntry("foo.txt");
                    using (Stream s = entry.Open())
                    {
                        byte[] data = File.ReadAllBytes("foo.txt");
                        s.Write(data, 0, data.Length);
                    }
                }
    // Reouvre l'archive pour confirmer que le fichier est bien la, et affiche sa taille.
                using(ZipArchive archive = ZipFile.OpenRead("test.zip"))
                {
                    var entry = archive.GetEntry("foo.txt");

                    Console.WriteLine("Name: {0}\r\nOriginalSize: {1}\r\nCompressedSize: {2}",
                        entry.Name, entry.Length, entry.CompressedLength);
                }

    </pre>
    <p>Je pense avoir fait le tour du sujet, j’éditerais peut être avec une section a propos de la classe GZipStream (qui permet de compresser/décompresser en mémoire, sans fichiers).</p>
    <p>Je vais aussi écrire un petit tool qui permetra de gérer les fichiers ZIP en ligne de commande.</p>
    <p> </p>
    <p>N’hésitez pas si vous avez des questions, ou des remarques a faire !</p>
    <p> </p>
    <p>Davy</p>

    C# dev
    github.com/DavyWk

    1 Reply Last reply
    2
    • SoulalexS
      SoulalexS
      Soulalex
      wrote on last edited by
      #2

      <p>Merci pour ce tutoriel 🙂 </p>

      Soulalex, Administrateur de Melinyel+ E-Mail : [email protected]+ GitHub : https://github.com/Soualex

      1 Reply Last reply
      0
      • AzadA
        AzadA
        Azad
        wrote on last edited by
        #3

        <p>Je me permet de up ce tutoriel, déjà parce que je l'avais raté de par mon absence, et également pour te féliciter ! Excellent boulot ! 🙂 <br/>
        +1 réputation.</p>

        Administrateur du forum.
        Contactez-moi par message privé ou par mail.

        1 Reply Last reply
        0
        • FaryBloodF
          FaryBloodF
          FaryBlood
          wrote on last edited by
          #4

          <p>Possible de décompresser le zip dans un fichier sélectionné? pour un système de mise a jours</p>

          1 Reply Last reply
          0
          • D
            D
            davydavek
            wrote on last edited by
            #5

            <p>Que veut tu dire par "dans un fichier sélectionné"?</p>

            C# dev
            github.com/DavyWk

            1 Reply Last reply
            0

            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

            With your input, this post could be even better 💗

            Register Login
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            • Login

            • Login or register to search.
            Powered by NodeBB Contributors
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • World
            • Users
            • Groups