Freigeben über


Komprimierung in Windows Phone 7.5

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