【C#】7zip を使って圧縮ファイルを展開する

2018年2月7日C#,開発

おはようございます。

前回に引き続き「7zip」を利用して、圧縮したファイルを展開してみます。

プログラムは前回のものを流用します。

スポンサーリンク

プログラムの修正

ライブラリ使用宣言の追加

ファイルの情報取得

using System.Diagnostics;

新規メソッドの追加

ファイルを展開する処理を追加します。

        /// <summary>
        /// 圧縮ファイルを展開します.
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        private int FileExpansion(string filePath, string outputDir)
        {

            // 長いパスを短くする
            IntPtr hWnd = this.Handle;
            StringBuilder strShortPath = new StringBuilder(1024);
            GetShortPathName(filePath, strShortPath, 1024);

            // 指定したディレクトリにフォルダ構成を保持した形で出力
            string strCommandLine = "x " + strShortPath.ToString() + " -o" + outputDir;
            StringBuilder strOutPut = new StringBuilder(1024);
            int ret = SevenZip(hWnd, strCommandLine, strOutPut, 1024);
            return ret;
        }

展開ボタンクリック時のイベント

画面に追加した「展開」ボタンをクリックした際のイベントを追加します。

            /// <summary>
            /// 展開ボタンクリックイベント
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnExpansion_Click(object sender, EventArgs e)
            {
                int count = 0;
    
                // 選択されたファイルを解凍
                var selectedItems = listView1.SelectedItems;
                foreach (ListViewItem item in selectedItems)
                {
                    // ファイルの情報を取得
                    FileInfo fi = new FileInfo(item.Name);
                    FileVersionInfo vi = FileVersionInfo.GetVersionInfo(item.Name);
    
                    // shell32で取得
                    string type = "";
                    SHFILEINFO shinfo = new SHFILEINFO();
                    IntPtr hSuccess = SHGetFileInfo(item.Name, 0, out shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
                    if (hSuccess != IntPtr.Zero)
                    {
                        type = shinfo.szTypeName;
                    }
    
                    // 圧縮ファイルの判定
                    // shll32、FileInfo、FileVersionInfoなどから判定できる
                    //if (type.IndexOf("圧縮") > -1 || type.IndexOf("7z") > -1)
                    //if (vi.FileDescription.IndexOf("7Z") > -1)
    
                    // FileInfoのAttributesで判定
                    if (fi.Attributes == FileAttributes.Archive) 
                    {
                        MessageBox.Show(item.Name + "を展開します。", "展開処理");
                        int ret = FileExpansion(item.Name, fi.FullName.Replace(fi.Extension, ""));
                        if (ret != 0)
                        {
                            MessageBox.Show(item.Name + "の展開に失敗しました。", "展開処理");
                        }
                        count++;
                    }
                }
    
                // 展開を実行したかどうかでメッセージを変更
                if (count == 0)
                {
                    MessageBox.Show("展開する対象が存在しません。", "展開処理");
                }
                else
                {
                    MessageBox.Show("ファイルの展開が完了しました。", "展開処理");
                }
            }

起動してみる

対象のファイルを選択する

前回の記事で圧縮したファイルを選択して、下のリストに追加します。

展開ボタンクリック

「展開」ボタンをクリックします。

展開プログレスダイアログ

展開中のプログレスダイアログも表示されます。

完了メッセージ

メッセージが表示されれば完了です。

まとめ

ひとまず、圧縮・展開までをやってみました。
色々オプションなんかもあるので、試してみたいと思います。

次回は自己解凍形式の実行ファイルを作成してみます。

ではでは。

 

スポンサーリンク


関連するコンテンツ

2018年2月7日C#,開発C#,WindowsForms,サンプルプログラム

Posted by doradora