ローカル 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: Compression method not supported)。
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 を正常に解凍したかどうか尋ねるべきだと思いましたか?
どんな助けでも大歓迎です。