私は、ローカルの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のコンテンツを処理しないでしょう。
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)
....
}
}
(私は.NET3かのために設定されていたことによるものだと思う私は、NuGetで見て、LZMA圧縮解除をサポートしていると主張するいくつかのC#ライブラリがあるが、彼らは私のWindows Phoneプロジェクトと互換性がありませんでした。 NET3ではなくNET4)。
LZMA SDKを使用してICSharpCode.SharpZipLib.LZMAクラスを実装することを考えましたが、ホイールを再開発する前に、誰かがWindows PhoneでLZMAジップを正常に圧縮解除したかどうか尋ねる必要がありましたか?
ご迷惑をおかけして申し訳ございません。