2012-03-04 30 views
1

私は、ローカルの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に失敗した(非サポート例外:圧縮方式がサポートされていません)。


    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ジップを正常に圧縮解除したかどうか尋ねる必要がありましたか?

ご迷惑をおかけして申し訳ございません。

答えて

1

私はLZMA圧縮解除のWindowsの携帯電話の実装が、運を探し続けたので、私はLZMA SDKのバージョン9.22ベータ版に基づくものを作りました。誰かがそれが有用であると思った場合に備えてここに詳細を掲載する(もちろん、保証はありません)。ソースはここで見つけることができます

プロジェクト: https://github.com/larryk78/SevenZip.Compression.LZMA.WindowsPhone/

実装は3つの解凍シナリオ(私はまだ、圧縮を見ていなかった)を提供します:(SDKから)

  1. StreamDecoderラップSevenZip.Compression.LZMA.Decoderをし、ストリームからストリームへの圧縮解除を提供します。
  2. IsolatedStorageDecoderストリームまたはIsolatedStorageにファイルから、IsolatedStorageのファイルに解凍するStreamDecoderを拡張します。ファイルへのストリームとファイルへのストリームとの両方を含む。
  3. WebClient2IsolatedStorageDecoderIsolatedStorageDecoderを展開してUriから圧縮ファイルをダウンロードし、それをIsolatedStorageのファイルに解凍します。

N.B. StreamDecoderBackgroundWorkerとして実装されているため、非同期で解凍作業が行われ(UIスレッドはブロックされません)、プログレスバーをProgressBarにフックすることができます。ここで

WebClient2IsolatedStorageDecoderを使った例です:

using SevenZip.Compression.LZMA.WindowsPhone; 
using System.ComponentModel; 

// <Button Content="Click Me!" Click="button_Click" /> 
private void button_Click(object sender, RoutedEventArgs e) 
{ 
    WebClient2IsolatedStorageDecoder decoder = new WebClient2IsolatedStorageDecoder(); 
    decoder.ProgressChanged += new ProgressChangedEventHandler(decoder_ProgressChanged); 
    decoder.RunWorkerCompleted += new RunWorkerCompletedEventHandler(decoder_RunWorkerCompleted); 
    decoder.DecodeAsync(new Uri("http://example.com/compressed_file.lzma"), "decompressed_file.txt"); 
} 

void decoder_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // <ProgressBar x:Name="Progress" /> 
    Progress.Value = e.ProgressPercentage; 
} 

void decoder_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error) 
    { 
     MessageBox.Show("Couldn't download/decompress: " + e.Error.Message); 
     return; 
    } 

    // ...do something with the decompressed data :) 
} 

あなたがそれをしようとした場合、私に知らせてください。かなり実ユーザ™のフィードバックのようなものは何もありません:)

乾杯、 ラリー

P.S.このライブラリは* .zipファイルを処理しません。 * .lzmaというLZMA圧縮ファイルで動作します。これらは、LZMA SDKのlzma.exeを使用して作成できます(バイナリも上記のgithubリポジトリにあります)。私はICSharpCode.SharpZipLibライブラリのメンテナーとLZMAを統合することについてチャットをしています。彼は熱心です。そこで何が起こるかを見てみましょう...

関連する問題