我正在開發使用本地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?
任何幫助非常感謝。