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