Я занимаюсь разработкой проекта для Windows Phone 7, в котором используется локальная база данных SQLite. База данных без сжатия ~ 40 МБ, поэтому я сжал ее, используя максимальное сжатие (Deflate) до ~ 20 МБ. Вот мой код (работает).
private void unzip_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream file = new IsolatedStorageFileStream(filename, FileMode.Create, store);
// TODO: switch from Deflate ~18.7MB to LZMA ~12.1MB (original ~41.5MB)
StreamResourceInfo zipInfo = new StreamResourceInfo((Stream)e.Argument, null);
StreamResourceInfo streamInfo = Application.GetResourceStream(zipInfo, new Uri(filename, UriKind.Relative));
long total = streamInfo.Stream.Length;
long done = 0;
int size = 32768;
byte[] data = new byte[size];
while ((size = streamInfo.Stream.Read(data, 0, data.Length)) > 0)
{
file.Write(data, 0, size);
done += size;
int percentComplete = (int)(100 * ((float)done / (float)total));
worker.ReportProgress(percentComplete);
}
file.Close();
}
20 МБ - хорошее улучшение, но я заметил, что архив 7z с максимальным сжатием (LZMA) достигает размера файла ~ 12 МБ. Формат zip-файла поддерживает содержимое LZMA, поэтому я переключил сжатый zip-файл Deflate для сжатого zz-файла LZMA и bang . Я получаю NullReferenceException: Application.GetResourceStream(...)
возвращает ноль. Предположительно, эта реализация не обрабатывает содержимое LZMA.
Я попробовал другую библиотеку, но, хотя она отлично работает для zip-файла Deflated, опять-таки происходит сбой на zz-архиве LZMA (NotSupportedException: метод сжатия не поддерживается).
using ICSharpCode.SharpZipLib.Zip;
...
private void unzip_DoWork(object sender, DoWorkEventArgs e)
{
...
using (ZipInputStream zip = new ZipInputStream((Stream)e.Argument))
{
ZipEntry entry = zip.GetNextEntry(); // consume zip header (required)
....
}
}
Я посмотрел в NuGet и, хотя есть несколько библиотек C #, которые утверждают, что поддерживают декомпрессию LZMA, они не были совместимы с моим проектом Windows Phone (думаю, из-за того, что он был настроен для .NET3 или .NET4, но нет. NET3.5).
Я думал о реализации класса ICSharpCode.SharpZipLib.LZMA с использованием LZMA SDK, но перед тем, как заново изобретать какие-либо колеса, я подумал, что мне следует спросить, успешно ли кто-нибудь распаковал zip-архив LZMA на Windows Phone?
Любая помощь высоко ценится.