Share via


Usando a compactação no Windows Phone 7.5

Artigo original publicado em 10 de abril de 2010, sábado

OBSERVAÇÃO: Como sempre, a versão Word desta publicação está anexada para conter a formatação brutal que este site faz em relação ao que eu realmente digitei. Buuuuu!!! :-)

Como eu tenho certeza que muitos de vocês sabem que realizou o desenvolvimento do Windows Phone, não há suporte integrado para compactação e descompactação. Vários amigos indicaram para o projeto SharpCompress no CodePlex e foi o que eu terminei usando também. A GRANDE coisa que estava faltando foi qualquer documentação para descompactar arquivos no phone. Eu conhecia um pouco o código e registrei para um aplicativo winform que usou o método WriteAllToDirectory para descompactar um arquivo compactado no Windows. No entanto, este método não existe na montagem para o Windows Phone. Além disso, é possível apenas oferecer o caminho no qual você pode descompactar ao usar a montagem do Windows Phone para o SharpCompress, você deve oferecer um objeto de fluxo.

Este é o trabalho final, mas exige que você faça coisas um pouco diferente de quando você usa na versão completa do Windows. Aqui estão algumas dicas para utilizar:

1. Enumerar o conjunto de Entrada do IReader obtido da fábrica do Reader:

//"sr" é um objeto leitor de fluxo do código anterior que contém uma matriz de byte do arquivo zip atual

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

{

while (reader.MoveToNextEntry())

{

   //IsDirectory sempre retorna falso em tudo que vi até o momento

   if (!reader.Entry.IsDirectory)

   {

      //processa a entrada, descrita a seguir

   }

   além

   {

       //não conhece o cenário que podemos obter aqui

       Debug.WriteLine(reader.Entry.FilePath);

   }

}

}

2. Cria o diretório para os arquivos, obtém uma instância IsolatedStorageFileStream na qual você pode gravar:

//IsDirectory sempre retorna falso em tudo que vi até o momento

if (!reader.Entry.IsDirectory)

{

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

}

 

private IsolatedStorageFileStream GetLocalFile(string fullPath)

{

   IsolatedStorageFileStream fs = null;

 

   try

   {

       //obter armazenamento isolado para que possamos criar diretórios e descompactar

       IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();

 

       //cortar tudo do último índice de /, que é o arquivo

       //nome, isto é, parecerá como folder/folder/folder/filename.txt

       cadeia de caracteres dirPath = fullPath.Substring(0, fullPath.LastIndexOf("/"));

 

       //o bom é que você pode criar o caminho de pasta completo em uma chamada

       if (!storage.DirectoryExists(dirPath))

          storage.CreateDirectory(dirPath);

 

       //agora que todos os diretórios existem, crie um fluxo para o

       // arquivo – novamente, bom porque você pode apenas dar o caminho completo

       fs = storage.CreateFile(fullPath);

   }

   catch (Exception ex)

   {

       Debug.WriteLine(ex.Message);

   }

 

   return fs;

}

3. Agora que você possui um fluxo, é possível gravar o arquivo individual usando o método WriteEntryTo:

if (!reader.Entry.IsDirectory)

{

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

 

   if (theFile != null)

       reader.WriteEntryTo(theFile);

}

 

Espero que isso ajude, a falta de documentação foi um problema. Portanto, eu tive que apenas resolver.

Esta é uma publicação localizada. Encontre o artigo original em Using Compression on Windows Phone 7.5