DOBON.NET DOBON.NETプログラミング掲示板過去ログ

自己解凍形式の解凍方法

環境/言語:[C# .Net2005 Framework2.0]
分類:[.NET]

自己解凍形式のexeをアプリで解凍する事は可能でしょうか?

zip、lzh等の圧縮ファイルの解凍方法は探せたのですが、
自己解凍形式の解凍は記述が見つかりませんでした。

ご存知の方がいらっしゃいましたら、ご教授願います。
宜しくお願い致します。
よくわからないけど、
>自己解凍形式のexeをアプリ
exeを実行すれば自動的に解凍してくれるものですよね?

で解凍する方法はexeしかしらないので、exeを実行する以外手はないかと思うのですけど。
当然、どこに解凍するかとか聞いてきても

exeを実行=キックしたら基本的に何も出来ない

のでどうしようもないです。

>自己解凍形式のexeをアプリ
が固定で、どういう動きをするのか理解していれば、Win32APIを駆使して(SendMessageあたり)
何とかなるかもしれませんけど。
あんまり時間取れないので、ちょっとだけ。

探された「zip、lzh等の圧縮ファイルの解答方法」はどのような方法でしょうか。
たぶん unlha32.dll とか unzip.dll を使う方法かと思われますが、それらの DLL は自己解凍形
式の圧縮ファイルの解凍もできると思いますので、そのまま解凍してみればよろしいかと。

つーか、自己解凍ファイルって解凍用プログラムの後ろにアーカイブがくっついたやつなので、
ヘッダの位置が少しずれてるだけの圧縮ファイルと思えばいい…はず。
■No18982に返信(よしおさんの記事)
> 自己解凍形式のexeをアプリで解凍する事は可能でしょうか?

基本的に自己解凍形式のexeを外部で制御することは難しいです。
ので、どうしたらいいのか?ですが、私の場合は、プロセス制御でコマンドプロンプト実行させ、自己解凍後、解凍されたファイルを取得しています。
もっ、もしかして僕の解釈が間違っているのでは…と不安になってきましたよ。
スレ主が戻ってこないので、なんとも言えませんが。

私は元の質問が
> zip、lzh等の圧縮ファイルの解凍方法は探せたのですが、
> 自己解凍形式の解凍は記述が見つかりませんでした。
こんな感じだったので
> 自己解凍形式ではない圧縮ファイルの解凍方法はわかったが記述がなかったの
> で自己解凍形式をどうやって解凍していいのかがわからなかった
と解釈してみたのですが、Blueさんやぺがらぼさんの解釈は
> 自己解凍形式の圧縮ファイルを『実行させて』解凍する方法がわからなかった
なのかな?

むむう、実行させて解凍させる方法だと、やっぱり実行させたら終わるまでは何
もできないですよね。

でもせっかくなので、昨日の僕の回答を検証してみました。
まず自己解凍形式のファイル test.exe を作成してから。

Unlha32.dll をこんな風に定義して

  [DllImport("unlha32.dll")]
  private static extern int Unlha(
    IntPtr hWnd,
    String szCmdLine,
    StringBuilder szOutput,
    uint dwSize
    );

ボタンのクリックイベントにこんな風に書いてみました。

  private void button1_Click(object sender, EventArgs e)
  {
    StringBuilder s = new StringBuilder(255);
    Unlha(IntPtr.Zero, "e d:\\test.exe d:\\test\\", s, 255);
  }

実行して、ボタンをクリックしたところキチンと d:\test にファイルが解凍さ
れました。
…って、これじゃダメ?
Blue様
ぽぴ王子様
ぺがらぼ様

返答が遅れてしまい、すみません。
短期間でこんなに返事を頂けると思いませんでした。

みなさんの解釈で間違いありません。
(自己解凍形式ファイルをプログラムで解凍したい)
質問の仕方も問題があったようで、申し訳ありません。
文章能力のなさを痛感しています。

>Blue様
>ぺがらぼ様
コマンドプロンプトからの実行をプログラムから行い、
解凍されたファイルを使用する ということですよね。
Bule様のおっしゃるように、どういう動きをするのか
理解しないといけません。

>ぽぴ王子様
unlha32.dllやunzip.dllを使用した方法で解凍できるのですね。
自己解凍形式では違った方法があるものだと思っていました。


教えて頂いた方法を自分でも試してみます。
方法があることが分かりましたので、解決済みにさせて頂きます。
ありがとうございました。
解決済み!
だいたいの解凍用DLLはここに転がっているので、ご参考までに…
総合アーカイバ
 http://www.csdinc.co.jp/archiver/
解決済み!
#いろいろ試されたら、既にご理解いただいていることかもしれませんが・・・

> みなさんの解釈で間違いありません。
> (自己解凍形式ファイルをプログラムで解凍したい)
> 質問の仕方も問題があったようで、申し訳ありません。
> 文章能力のなさを痛感しています。

ポイントはそこではなく、「自己解凍形式ファイル」が"何の"自己解凍形式か?が明記されていないことではないでしょうか?
自己解凍形式ファイルというファイル形式はなく、
正確にはzipの自己解凍形式、lzhの自己解凍形式、xxxの自己解凍形式があるので、
圧縮形式がzip、lzh、その他、不明のいずれかによって回答が変わってきます。

圧縮形式がzipまたはlzhであり、かつ、そのどちらのファイルなのか?が
わかっている場合の回答がぽぴ王子さんの回答です。
圧縮形式が不明な場合の回答がBlueさん、ぺがらぼさんの回答です。
もし統合アーカイバプロジェクト仕様のDLLを使用してもよいということであれば、自己解凍形式ファイルの場合であっても、私のサイトで紹介している方法で解凍できるDLLの検索と解凍が可能ではないでしょうか?(DLLによっては無理なものもあるかもしれませんが。)

遅延バインディングによりアンマネージDLL関数を呼び出す
http://dobon.net/vb/dotnet/links/extractarchive.html
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板