我正在开发使用本地SQLite数据库的Windows Phone 7项目。该数据库大约40MB未压缩,所以我使用最大压缩(Deflate)将其压缩到〜20MB。这是我的代码(工作)。如何在Windows Phone 7上解压缩LZMA压缩的zip文件?
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内容。
我试过另一个库,但虽然它对于压缩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,虽然有其声称支持LZMA压缩一些C#库,他们没有与我的Windows Phone项目兼容的(我认为由于已经建立了.NET3或。 NET4但不是.NET3.5)。
我想过使用LZMA SDK实现一个ICSharpCode.SharpZipLib.LZMA类,但在我重新发明任何车轮之前,我想我应该问问任何人是否已成功解压Windows Phone上的LZMA zip?
任何帮助非常感谢。