圧縮の進行状況を報告する
Contents
[
Hide
Show
]進行状況イベント ハンドラー
特にデータサイズが大きい場合、圧縮プロセスに時間がかかることがあります。 zip アーカイブの場合、投稿を維持するための CompressionProgressed イベント があります。このイベントは、これまでに進行したバイト数を含む ProgressEventArgs に依存します。 これは、 ラムダ式 を使用してこのイベントをサブスクライブする方法です。
1 エントリ.CompressionProgressed += (s, e) => {
2 Console.WriteLine(string.Format("{0} バイト圧縮", e.ProceededBytes));
3 };
Zip 進捗率のレポート
CompressionProgressed
イベントが発生するたびに、ProceededBytes
の数値を元のファイルの長さで割ります。このようにして、現時点での圧縮バイトの比率を求めます。ここに完全なサンプルがあります。
- File.Open を使用して huge.bin ファイルを読み取りモードで開き、圧縮の準備をします。
- 圧縮に PPMdCompressionSettings を指定して、Archive クラスの新しいインスタンスを初期化します。
- CreateEntry メソッドを使用して huge.bin ファイルのアーカイブ エントリを作成し、ソース ファイル ストリームにリンクします。
- イベント ハンドラーを CompressionProgressed イベントにアタッチして、圧縮の進行状況を監視します。これまでに圧縮されたファイルの割合を計算します。
- イベント ハンドラー内で圧縮パーセンテージを更新し、進行状況が増加するたびにコンソールに表示します。
- 圧縮が完了したら、アーカイブを指定した zipFile に保存します。
1 using (FileStream ソース = File.Open("huge.bin", FileMode.Open, FileAccess.Read))
2 {
3 using (var archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
4 {
5 ArchiveEntry エントリ = archive.CreateEntry("huge.bin", ソース);
6 int パーセント準備 = 0;
7 エントリ.CompressionProgressed += (s, e) =>
8 {
9 int パーセント = (int)((100 * (long)e.ProceededBytes) / source.Length);
10 if (パーセント > パーセント準備完了)
11 {
12 Console.WriteLine(string.Format("{0}% 圧縮", パーセント));
13 パーセント準備 = パーセント;
14 }
15 };
16 archive.Save(zipFile);
17 }
18 }
7z の進捗率のレポート
7z アーカイブでも同様のアプローチが行われます。そのエントリには独自の CompressionProgressed イベント があります。
手順: C# の 7z アーカイブで LZMA2 による圧縮の進行状況を監視する</あ>
- ソース ファイル (huge.bin) を読み取りモードで開きます。
- LZMA2 圧縮設定を使用して SevenZipArchive オブジェクトを作成します。
- CreateEntry メソッドを使用して、ソース ファイルをエントリとしてアーカイブに追加します。
- CompressionProgressed イベントをサブスクライブして、圧縮の進行状況を追跡および計算します。
- 進行状況が更新されるたびに、完了した圧縮の割合を計算します。
- アーカイブを指定した保存先 (zipFile) に保存します。
1using (FileStream ソース = File.Open("huge.bin", FileMode.Open, FileAccess.Read))
2 {
3 using (var archive = new SevenZipArchive(new SevenZipEntrySettings(new SevenZipLZMA2CompressionSettings())))
4 {
5 SevenZipArchiveEntry エントリ = archive.CreateEntry("huge.bin", ソース);
6 int パーセント準備 = 0;
7 entry.CompressionProgressed += デリゲート (オブジェクト s、ProgressEventArgs e)
8 {
9 // は SevenZipArchiveEntry です
10 int パーセント = (int)((100 * (long)e.ProceededBytes) / source.Length);
11 if (パーセント > パーセント準備完了)
12 {
13 パーセント準備 = パーセント;
14 }
15 };
16 archive.Save(zipFile);
17 }
18 }