我正在开发一个使用本地 SQLite 数据库的 Windows Phone 7 项目。该数据库未压缩约 40MB,因此我使用最大压缩(Deflate)将其压缩到约 20MB。这是我的代码(工作)。
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();
}
20MB 是一个很好的改进,但我注意到使用最大压缩 (LZMA) 的 7z 存档文件大小约为 12MB。zip 文件格式支持 LZMA 内容,因此我将 Deflate 压缩 zip 文件切换为 LZMA 压缩 zip 文件和bang。我得到 NullReferenceException:Application.GetResourceStream(...)
正在返回 null。据推测,该实现不处理 LZMA 内容。
我尝试了另一个库,但虽然它适用于 Deflated zip,但它在 LZMA zip 上再次失败(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 设置了)。
我考虑过使用 LZMA SDK 实现 ICSharpCode.SharpZipLib.LZMA 类,但在我重新发明任何轮子之前,我想我应该问一下是否有人在 Windows Phone 上成功解压缩了 LZMA zip?
非常感谢任何帮助。