2019-08-07に投稿

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

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

プログラムは前回のものを流用します。
【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("ファイルの展開が完了しました。", "展開処理");
                }
            }

起動してみる

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

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

展開ボタンクリック

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

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

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

完了メッセージ

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

まとめ

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

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

ではでは。

 

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント