Article d’origine publié le samedi 14 avril 2012

REMARQUE : comme d’habitude, une version Word de ce billet est jointe pour compenser le formatage sommaire de ce site !!! :-)

Comme la plupart d’entre vous qui ont déjà fait du développement sur Windows Phone doivent le savoir, il n’y a pas de prise en charge intégrée pour la compression et la décompression. De nombreuses personnes ont mentionné le projet SharpCompress sur CodePlex, et j’ai finalement opté moi aussi pour cette solution. Cependant sa principale faiblesse était l’absence totale de documentation sur la décompression de fichiers sur le téléphone. J’avais beaucoup de code écrit pour une application WinForms qui utilisait la méthode WriteAllToDirectory pour décompresser un fichier sur Windows. Cependant, cette méthode n’existe pas dans l’assembly pour Windows Phone. En outre, il est impossible de fournir le chemin de décompression lors de l’utilisation de l’assembly Windows Phone pour SharpCompress, vous devez lui fournir un objet flux.

Cela fonctionne finalement, mais nécessite une procédure largement différente de celle utilisée sur la version complète de Windows. Voici quelques conseils qui vous seront utiles à cet égard :

    1. Énumérez par la collection Entry du IReader que vous obtenez de la fabrique Reader :

      //"sr" est un objet lecteur de flux du code précédent qui contient le tableau d’octets du fichier zip concerné

      using (var reader = ReaderFactory.Open(sr))

      {

      while (reader.MoveToNextEntry())

      {

         //IsDirectory renvoie toujours false dans tous les cas que j’ai rencontrés jusqu’ici

         if (!reader.Entry.IsDirectory)

         {

            //traiter l’entrée, décrite ci-dessous

         }

         else

         {

             //je ne connais pas de scénario où nous pouvons arriver ici

             Debug.WriteLine(reader.Entry.FilePath);

         }

      }

      }

        2. Créez le ou les répertoires pour les fichiers, puis obtenez une instance IsolatedStorageFileStream dans laquelle vous pouvez écrire :

        //IsDirectory renvoie toujours false dans tous les cas que j’ai rencontrés jusqu’ici

        if (!reader.Entry.IsDirectory)

        {

               IsolatedStorageFileStream theFile = GetLocalFile(reader.Entry.FilePath);

        }

         

        private IsolatedStorageFileStream GetLocalFile(string fullPath)

        {

           IsolatedStorageFileStream fs = null;

         

           try

           {

               //obtenir un stockage isolé afin que nous puissions créé des répertoires et décompresser

              IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();

         

              //supprimer tout à partir du dernier index de /, ce qui correspond au nom du

              //fichier, c’est-à-dire que nous obtenons quelque chose du genre dossier/dossier/dossier/nomfichier.txt

              string dirPath = fullPath.Substring(0, fullPath.LastIndexOf("/"));

         

              //ce qui est bien ici c’est que vous pouvez créer le chemin complet du dossier dans un appel

              if (!storage.DirectoryExists(dirPath))

                 storage.CreateDirectory(dirPath);

         

               //maintenant que tous les répertoires existent, créez un flux pour le

               // fichier – de nouveau, c’est très bien car vous pouvez simplement donner le chemin complet

              fs = storage.CreateFile(fullPath);

          }

          catch (Exception ex)

          {

              Debug.WriteLine(ex.Message);

          }

         

          return fs;

        }

          3. Maintenant que vous avez un flux, vous pouvez écrire les fichiers individuels et utiliser la méthode WriteEntryTo :

            eader.Entry.IsDirectory)

            {

               IsolatedStorageFileStream theFile = GetLocalFile(reader.Entry.FilePath);

             

               if (theFile != null)

                   reader.WriteEntryTo(theFile);

            }

             

            J’espère que cela sera utile, l’absence de documentation était problématique j’ai donc dû improviser.

            Ceci est un billet de blog localisé. L’article d’origine est disponible à l’adresse Using Compression on Windows Phone 7.5