【C#】7zipを使ってファイル・フォルダの圧縮をしてみる
おはようございます
今回は画面で選択したファイルやフォルダをまとめて圧縮してみようと思います。
圧縮するためのライブラリで、圧縮率の高さなどが人気の「7zip」というツールを使用します。
プログラムは前回のものを流用します。
スポンサーリンク
7zipのdllを入手、配置
下記サイトより入手。
http://www.vector.co.jp/soft/win95/util/se252429.html
作者:秋田 稔 様
http://www.vector.co.jp/vpack/browse/person/an018964.html
ダウンロードした「7-zip32.dll」をプロジェクトの直下にコピーします。
プロパティから「出力ディレクトリにコピー」オプションを「常にコピーする」に変更します。
画面の修正
画面に圧縮ボタン、展開ボタン(今回は未使用)を追加
プログラムの修正
ライブラリ使用宣言の追加
実行ディレクトリのパスを取得するために利用
1 | usingSystem.Reflection; |
新規メソッドの追加
圧縮対象のフォルダを一時ディレクトリにコピーするために再帰処理をするメソッドを追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /// <summary> /// ディレクトリをコピーする /// </summary> /// <param name="from">コピー元</param> /// <param name="to">コピー先</param> publicstaticvoidCopyDirectory(stringfrom,stringto) { // ディレクトリが存在しない場合は作成 if(!Directory.Exists(to)) { Directory.CreateDirectory(to); File.SetAttributes(to,File.GetAttributes(from)); } // コピー先のディレクトリ名の末尾に"\"をつける if(!to.EndsWith(Path.DirectorySeparatorChar.ToString())) { to+=Path.DirectorySeparatorChar; } // コピー元のディレクトリにあるファイルをコピー string[]files=Directory.GetFiles(from); foreach(stringfile infiles) { File.Copy(file,to+Path.GetFileName(file),true); } // サブディレクトリを再帰処理する string[]dirs=Directory.GetDirectories(from); foreach(stringdir indirs) { CopyDirectory(dir,to+Path.GetFileName(dir)); } } |
圧縮ボタンクリックイベントの追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | /// <summary> /// 圧縮ボタンクリックイベント. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidbtnCompless_Click(objectsender,EventArgse) { // 実行ディレクトリパスの取得 Assembly mainAssembly=Assembly.GetExecutingAssembly(); // 実行フォルダ取得 stringappDir=Path.GetDirectoryName(mainAssembly.Location); // 一時フォルダパス stringcopyTo=appDir+"\\Compress"; try { // なければ作成 if(!Directory.Exists(copyTo)) { Directory.CreateDirectory(copyTo); } // 選択されたファイルを一時ディレクトリにコピー varselectedItems=listView1.SelectedItems; foreach(ListViewItem item inselectedItems) { // ファイル・ディレクトリを判定 if(File.Exists(item.Name)) { // 存在する場合は上書きする File.Copy(item.Name,copyTo+"\\"+item.Text,true); } elseif(Directory.Exists(item.Name)) { // サブディレクトリも再帰処理でコピーする CopyDirectory(item.Name,copyTo); } } // 圧縮処理 IntPtr hWnd=this.Handle; StringBuilder strShortPath=newStringBuilder(1024); GetShortPathName(copyTo,strShortPath,1024); // zip圧縮 stringstrCommandLine="a -tzip archive.zip "+strShortPath.ToString()+"\\*"; // 7z圧縮 // string strCommandLine = "a -t7z archive.7z " + strShortPath.ToString() + "\\*"; // zip超圧縮 //string strCommandLine = "a -tzip archive.zip " + strShortPath.ToString() + "\\* -mx9"; // zip無圧縮 //string strCommandLine = "a -tzip archive.zip " + strShortPath.ToString() + "\\* -mx0"; // zipパスワード("password")付圧縮(処理状況ダイアログ非表示) //string strCommandLine = "a -tzip -hide archive.zip " + strShortPath.ToString() + "\\* -ppassword"; // 7zパスワード("password")付圧縮(書庫のヘッダも暗号化) //string strCommandLine = "a -t7z archive.7z " + strShortPath.ToString() + "\\* -ppassword -mhe"; StringBuilder strOutPut=newStringBuilder(1024); intret=SevenZip(hWnd,strCommandLine,strOutPut,1024); if(ret==0) { MessageBox.Show(appDir+"に archive.zip を作成しました。","圧縮処理"); } } catch(Exception ex) { MessageBox.Show(ex.Message,"圧縮エラー"); } finally { //Directory.Delete(copyTo, true); } } |
起動してみる
対象のファイル(今回はフォルダ)を選択して「追加」ボタンをクリック、下のリストに追加されたら「圧縮」ボタンをクリックします。
ちゃんと圧縮中のプログレスダイアログも表示できます。
無事に圧縮ファイルを作成できました。
まとめ
ちょっと長くなったので、展開(解凍)はまた次回。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません