Veröffentlichung des Originalartikels: 14.04.2012

HINWEIS:  Wie gewohnt habe ich die Word-Version dieses Beitrags angefügt, um der brutalen Formatierung zu begegnen, die diese Website auf meine tatsächliche Eingabe anwendet. Arghhh!!!  :-)

Wie viele von Ihnen wissen, die für Windows Phone entwickelt haben, gibt es keine integrierte Unterstützung für die Komprimierung und Dekomprimierung. Viele Kollegen haben auf das SharpCompress-Projekt auf der CodePlex-Website hingewiesen, auf das ich letztendlich auch zurückgegriffen habe. Aber das Wesentliche, was mir gefehlt hat, war irgendeine Dokumentation dazu, wie Dateien auf dem Telefon dekomprimiert werden. Ich hat eine Menge Code für eine Winforms-Anwendung geschrieben, in dem die WriteAllToDirectory-Methode zum Dekomprimieren einer komprimierten Datei unter Windows verwendet wird. Diese Methode ist allerdings in der Assembly für Windows Phone nicht vorhanden. Darüber hinaus reicht es nicht aus, bei Verwenden der Windows Phone-Assembly für SharpCompress den Pfad anzugeben, in den die Dekomprimierung erfolgen soll. Sie müssen ein Stream-Objekt angeben.

Dies funktionierte letztendlich, erfordert jedoch andere Schritte als bei der Vollversion von Windows. Hier nun ein paar hilfreiche Tipps:

    1. Zählen Sie die IReader-Auflistung der IReader-Schnittstelle durch, die Sie von der Reader-Factory erhalten:

      //"sr" ist ein StreamReader-Objekt aus dem vorherigen Code, das das Bytearray der tatsächlichen ZIP-Datei enthält

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

      {

      while (reader.MoveToNextEntry())

      {

         //IsDirectory gibt nach allem, was ich weiß, stets false zurück

         if (!reader.Entry.IsDirectory)

         {

            //den Eintrag verarbeiten (nachfolgend beschrieben)

         }

         else

         {

             //Kenne kein Szenario, bei dem wir hier enden

             Debug.WriteLine(reader.Entry.FilePath);

         }

      }

      }

        2. Erstellen Sie die Verzeichnisse für die Dateien, und rufen Sie anschließend eine IsolatedStorageFileStream-Instanz ab, in die Sie schreiben können:

        //IsDirectory gibt nach allem, was ich weiß, stets false zurück

        if (!reader.Entry.IsDirectory)

        {

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

        }

         

        private IsolatedStorageFileStream GetLocalFile(string fullPath)

        {

           IsolatedStorageFileStream fs = null;

         

           try

           {

               //Isolierten Speicher abrufen, um Verzeichnisse erstellen und dekomprimieren zu können

               IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();

         

               //Alles vom letzten Index von / entfernen, was den Dateinamen

               //darstellt (sieht aus wie Ordner/Ordner/Ordner/Dateiname.txt)

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

         

               //Praktisch ist, dass Sie den vollständigen Ordnerpfad in einem Aufruf erstellen können

               if (!storage.DirectoryExists(dirPath))

                  storage.CreateDirectory(dirPath);

         

               //Nun da alle Verzeichnisse vorhanden sind, erstellen Sie einen Stream für die

               //Datei – wiederum praktisch, da Sie nur den vollständigen Pfad angeben können

               fs = storage.CreateFile(fullPath);

           }

           catch (Exception ex)

           {

               Debug.WriteLine(ex.Message);

           }

         

           return fs;

        }

          3. Nun da Sie über einen Stream verfügen, können Sie mithilfe der WriteEntryTo-Methode die einzelne Datei herausschreiben:

            if (!reader.Entry.IsDirectory)

            {

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

             

               if (theFile != null)

                   reader.WriteEntryTo(theFile);

            }

             

            Ich hoffe, dies hilft irgendjemand. Der Mangel an Dokumentation war besorgniserregend, sodass ich mich durchfrickeln musste.

            Es handelt sich hierbei um einen übersetzten Blogbeitrag. Sie finden den Originalartikel unter Using Compression on Windows Phone 7.5