Uso de compresión en Windows Phone 7.5

Artículo original publicado el sábado, 14 de abril de 2012

NOTA: Como de costumbre, la versión para Word de esta publicación está adjunta para contrarrestar el brutal formato que aplica este sitio a lo que realmente se escribe. ¡¡¡Buuu!!! :-)

Estoy seguro de que muchos de ustedes, especialmente los que hayan colaborado en el desarrollo de Windows Phone, saben que no existe un soporte integrado para la compresión y la descompresión. Muchos usuarios han señalado al proyecto de SharpCompress en CodePlex, que es el que he terminado usando yo también. Sin embargo, le faltaba algo importante: algún tipo de documentación para descomprimir los archivos en el teléfono. Contaba con parte del código que había escrito para una aplicación WinForm que utilizaba el método WriteAllToDirectory para descomprimir un archivo comprimido en Windows. Sin embargo, este método ya no existe en el ensamblado de Windows Phone. Además, no puede limitarse a proporcionar una ruta de acceso donde descomprimir cuando utilice el ensamblado de Windows Phone para SharpCompress, tiene que darle un objeto de secuencia.

Esto funcionaba, pero es necesario que se hagan las cosas de manera distinta a cuando se usa en la versión completa de Windows. Aquí tiene algunas sugerencias para conseguirlo:

1. Enumere la colección de entrada del IReader obtenido de la fábrica del lector:

//"sr" es un objeto del lector de secuencias del código anterior que contiene la matriz de bytes del archivo zip real

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

{

while (reader.MoveToNextEntry())

{

   //IsEl directorio siempre devuelve el valor false en todo lo que he visto hasta ahora

   if (!reader.Entry.IsDirectory)

   {

      //procesar la entrada, descrito a continuación

   }

   else

   {

       //no se conoce un caso que nos pueda llevar aquí

       Debug.WriteLine(reader.Entry.FilePath);

   }

}

}

2. Cree los directorios para los archivos y, a continuación, obtenga una instancia IsolatedStorageFileStream donde pueda escribir:

//IsEl directorio siempre devuelve el valor false en todo lo que he visto hasta ahora

if (!reader.Entry.IsDirectory)

{

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

}

 

private IsolatedStorageFileStream GetLocalFile(string fullPath)

{

   IsolatedStorageFileStream fs = null;

 

   try

   {

       //obtener almacenamiento aislado para que podamos crear directorios y descomprimir

       IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();

 

       //recortar todo desde el último índice de /, que es el archivo

       //nombre, es decir, tendrá un aspecto similar a carpeta/carpeta/carpeta/nombre_archivo.txt

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

 

       //lo mejor es que puede crear la ruta de acceso completa a la carpeta en una sola vez

       if (!storage.DirectoryExists(dirPath))

          storage.CreateDirectory(dirPath);

 

       //ahora que existen todos los directorios, cree una secuencia para

       // archivo. De nuevo, se puede dar la ruta de acceso completa

       fs = storage.CreateFile(fullPath);

   }

   catch (Exception ex)

   {

       Debug.WriteLine(ex.Message);

   }

 

   return fs;

}

3. Ahora que tiene una secuencia, puede escribir el archivo individual usando el método WriteEntryTo:

if (!reader.Entry.IsDirectory)

{

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

 

   if (theFile != null)

       reader.WriteEntryTo(theFile);

}

 

Espero que esto ayude a alguien, la falta de documentación era un problema, así que le he dado unas cuantas vueltas.

Esta entrada de blog es una traducción. Puede encontrar el artículo original en Using Compression on Windows Phone 7.5