【C#】7zip(Sfx)で自己解凍exeを作成する
おはようございます。
予告通り、今回は「7zip」を利用して自己解凍形式の実行ファイルを作成してみます。
プログラムは前回のものを流用します。
スポンサーリンク
自己解凍形式について
7zip形式の圧縮ファイルと、設定ファイルをひとまとめにして実行ファイルとし、
ファイルの展開後に任意のプログラムを実行することができます。
主にインストーラーなんかに使われているようです。詳しくは調べてみてください。
画面の修正

自己解凍exe出力ボタンを追加します。
SFXのDLLをダウンロードして配置
https://ja.osdn.net/projects/sevenzip/downloads/64455/7z920_extra.7z/

パッケージエクスプローラーで、ダウンロードした「7zS.sfx」をプロジェクトに追加します。
※参照の追加ではありません
設定ファイルの作成
config.txt
| 1 2 3 4 5 6 7 | ;!@Install@!UTF-8! Title="VisualStudioSolution実行" BeginPrompt="自己解凍exeを実行しますか?" Directory="" ExecuteFile=".\\archive\\WpfApp1.sln" RunProgram="" ;!@InstallEnd@! | 
作成したファイルは、実行ファイルから参照できる場所においてください。
プログラムの修正
新規メソッドの追加
自己解凍exeを出力する処理を追加します。
| 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 |             /// <summary>             /// 自己解凍exeを出力します.             /// </summary>             /// <param name="filePath"></param>             /// <returns></returns>             privateintOutputSelfExtractFile(stringfilePath,stringoutputDir)             {                 // 指定したディレクトリにフォルダ構成を保持した形で出力                 stringstrCommandLine="copy /b 7zS.sfx + "+"config.txt + "+filePath+" "+outputDir+"\\SelfExtract.exe";                 // コマンドプロンプトで実行                 Processp=newProcess();                 //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定                 p.StartInfo.FileName=System.Environment.GetEnvironmentVariable("ComSpec");                 //出力を読み取れるようにする                 p.StartInfo.UseShellExecute=false;                 p.StartInfo.RedirectStandardOutput=true;                 p.StartInfo.RedirectStandardInput=false;                 //ウィンドウを表示しないようにする                 p.StartInfo.CreateNoWindow=true;                 //コマンドラインを指定("/c"は実行後閉じるために必要)                 p.StartInfo.Arguments=@"/c "+strCommandLine;                 //起動                 p.Start();                 //出力を読み取る                 stringresults=p.StandardOutput.ReadToEnd();                 //プロセス終了まで待機する                 //WaitForExitはReadToEndの後である必要がある                 //(親プロセス、子プロセスでブロック防止のため)                 p.WaitForExit();                 p.Close();                 return0;             } | 
新規イベントの追加
追加したボタンのクリック時の処理を追加します。
| 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 |             /// <summary>             /// 自己解凍exe出力ボタンクリックイベント.             /// </summary>             /// <param name="sender"></param>             /// <param name="e"></param>             privatevoidbtnSfx_Click(objectsender,EventArgse)             {                 intcount=0;                 // 選択されたファイルを解凍                 varselectedItems=listView1.SelectedItems;                 foreach(ListViewItem item inselectedItems)                 {                     // ファイルの情報を取得                     FileInfo fi=newFileInfo(item.Name);                     FileVersionInfo vi=FileVersionInfo.GetVersionInfo(item.Name);                     // shell32で取得                     stringtype="";                     SHFILEINFO shinfo=newSHFILEINFO();                     IntPtr hSuccess=SHGetFileInfo(item.Name,0,outshinfo,(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 (vi.FileDescription.IndexOf("7Z") > -1)                     // if (fi.Attributes == FileAttributes.Archive)                     // ファイル種別で判定                     if(type.IndexOf("7Z")>-1)                     {                         MessageBox.Show(item.Name+"の自己解凍exeを作成します。","自己解凍exe出力処理");                         intret=OutputSelfExtractFile(item.Name,fi.DirectoryName);                         if(ret!=0)                         {                             MessageBox.Show(item.Name+"の自己解凍exe出力に失敗しました。","自己解凍exe出力処理");                         }                         count++;                     }                 }                 // 展開を実行したかどうかでメッセージを変更                 if(count==0)                 {                     MessageBox.Show("自己解凍する対象が存在しません。","自己解凍exe出力処理");                 }                 else                 {                     MessageBox.Show("自己解凍exeの出力が完了しました。","自己解凍exe出力処理");                 }             } | 
起動してみる
起動、「7zip」形式のファイルを選択し、「自己解凍exe出力」ボタンをクリックします。



圧縮ファイルと同じディレクトリに「SelfExtraxt.exe」が出力されます。

出力された「SelfExtraxt.exe」を実行してみます。

プログレスも表示されます。
まとめ
色々使いどころはあるかと思います。
7-zip32.dll には内蔵されている自己解凍処理もあり、そちらは設定ファイルを画面から設定できたりもするので気になる方は調べてみてください。
ではでは。










ディスカッション
コメント一覧
まだ、コメントがありません