Aller directement au contenu
  • Catégories
  • Récent
  • Mots-clés
  • Populaire
  • Web
  • Utilisateurs
  • Groupes
Habillages
  • Clair
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Sombre
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Défaut (Aucun habillage)
  • Aucun habillage
Réduire
Melinyel

Melinyel

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

Les fichiers ZIP

Planifié Épinglé Verrouillé Déplacé C#
5 Messages 4 Publieurs 4.6k Vues
  • Du plus ancien au plus récent
  • Du plus récent au plus ancien
  • Les plus votés
Répondre
  • Répondre à l'aide d'un nouveau sujet
Se connecter pour répondre
Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
  • D Hors-ligne
    D Hors-ligne
    davydavek
    a écrit sur dernière édition par
    #1

    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 System.IO.Compression.
    Il vous faudra donc ajouter deux références (Explorateur de solution -> Références -> Ajouter Référence)

    4e631291de.png

    Puis vérifiez que les références ont bien été ajoutées:

    2ac2a3d543.png

    Maintenant il ne vous reste plus qu'a ajouter un using tout en haut de votre code:

    using System.IO.Compression;
    

    (Nous utiliserons aussi les namespaces System et Sytem.IO)
     
    Pour commencer, nous avons les fonctions de la classe statique ZipFile :
    -Prend tout les fichiers contenus dans le dossier "folder", puis les compresses dans le fichier "compressed.zip"

    ZipFile.CreateFromDirectory("folder", "compressed.zip");
    

    Avec l'enumeration CompressionLevel, il est possible d'optimiser la compression, sois pour la vitesse, sois pour la taille du fichier.
    -Extrait les fichiers contenus dans le fichier "compressed.zip" vers le dossier "folder"

    ZipFile.ExtractToDirectory("compressed.zip", "folder");
    

    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.
     
     
    Maintenant passons au choses un peu plus complexes, la classe ZipArchive 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.
     
    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:

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

    La classe ZipArchive nous permet de créer, de lire et aussi de mettre a jour des archives ZIP.
    -Création:

    ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Create);
    

    -Lecture:

    ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Read); 
    // equivalent 
    ZipArchive archive = ZipFile.OpenRead("name.zip");
     
    

    -Mise a jour:

    ZipArchive archive = ZipFIle.Open("name.zip", ZipArchiveMode.Update);
    

    Dans l'archive, chaque fichier est représenter par une ZipArchiveEntry, qu'on peut obtenir grâce a la proprietee Entries de la classe ZipArchive.

    On peut récupérer un objet ZipArchiveEntry en choisissant un existant:

    var entry = archive.GetEntry("file.txt");
    

    Ou en créant une nouvelle:

    var entry = archive.CreateEntry("file.txt");
    

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

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

    La fonction Open revois un objet Stream, qui va nous permettre de modifier directement le contenu du fichier.

    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):

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

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

    Je vais aussi écrire un petit tool qui permetra de gérer les fichiers ZIP en ligne de commande.

    N’hésitez pas si vous avez des questions, ou des remarques a faire !

    Davy

    C# dev

    github.com/DavyWk

    1 réponse Dernière réponse
    2
    • SoulalexS Hors-ligne
      SoulalexS Hors-ligne
      Soulalex
      a écrit sur dernière édition par
      #2

      Merci pour ce tutoriel 🙂

      Soulalex, Administrateur de Melinyel
      + E-Mail : [[email protected]](mailto:[email protected] "Lien vers un courriel")
      + GitHub : [https://github.com/Soualex](https://github.com/Soualex "Lien externe")

      1 réponse Dernière réponse
      0
      • AzadA Hors-ligne
        AzadA Hors-ligne
        Azad
        a écrit sur dernière édition par
        #3

        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 ! 🙂
        +1 réputation.

        Administrateur du forum.

        Contactez-moi par message privé ou par mail.

        1 réponse Dernière réponse
        0
        • FaryBloodF Hors-ligne
          FaryBloodF Hors-ligne
          FaryBlood
          a écrit sur dernière édition par
          #4

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

          1 réponse Dernière réponse
          0
          • D Hors-ligne
            D Hors-ligne
            davydavek
            a écrit sur dernière édition par
            #5

            Que veut tu dire par "dans un fichier sélectionné"?

            C# dev

            github.com/DavyWk

            1 réponse Dernière réponse
            0

            Bonjour ! Vous semblez intéressé par cette conversation, mais vous n’avez pas encore de compte.

            Marre de refaire défiler les mêmes messages ? Créez un compte pour retrouver votre position, recevoir des notifications des nouvelles réponses, sauvegarder vos favoris et voter pour les messages que vous appréciez.

            Grâce à votre participation, ce message peut devenir encore meilleur 💗

            S'inscrire Se connecter
            Répondre
            • Répondre à l'aide d'un nouveau sujet
            Se connecter pour répondre
            • Du plus ancien au plus récent
            • Du plus récent au plus ancien
            • Les plus votés


            • Se connecter

            • Connectez-vous ou inscrivez-vous pour faire une recherche.
            Powered by NodeBB Contributors
            • Premier message
              Dernier message
            0
            • Catégories
            • Récent
            • Mots-clés
            • Populaire
            • Web
            • Utilisateurs
            • Groupes