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

アンインストール時にアプリケーションディレクトリごと削除する方法

環境/言語:[Microsoft Visual C++ .NET]
分類:[インストーラ]

現在Microsoft Visual C++ .NETにてセットアッププロジェクトであるアプリケーションのインストーラ(MSI)を作成しております。
インストール時にアプリケーションディレクトリ(C:\Program Files\xxx)の中にコピーしたファイルはアンインストール時に削除されるのですが、アプリケーションがインストール後にこのディレクトリに作成したファイルは削除されずに残ってしまいます。
できればインストール時に作成したアプリケーションディレクトリごと削除したいのですが、どこで指定すればいいのかわかりません。
想定した動作をするインストーラ(アンインストーラ)はよくあるのでできる方法があると思うのでご存知の方がいましたら情報をお待ちしております。
> インストール時にアプリケーションディレクトリ(C:\Program Files\xxx)の中にコピーしたファイルはアンインストール時に削除されるのですが、アプリケーションがインストール後にこのディレクトリに作成したファイルは削除されずに残ってしまいます。

「お作法」の点から言えば、インストールディレクトリにファイルを作ってはいけません。
>>インストール時にアプリケーションディレクトリ(C:\Program Files\xxx)の中にコピーしたファイルはアンインストール時に削除されるのですが、アプリケーションがインストール後にこのディレクトリに作成したファイルは削除されずに残ってしまいます。
>
> 「お作法」の点から言えば、インストールディレクトリにファイルを作ってはいけません。
>

なるほど、そうかもしれませんね。ただし、今回のアプリはインストール後にアップデートでパッチを当てる必要があるためこの仕様になっています。
インストール時にはディレクトリだけを作成し、そこにパッチをダウンロードする形にしましたが、何かダウンロードしたファイルがある場合、アンインストール時に自動で削除されませんでした。
引き続き情報をお待ちしております。
> 今回のアプリはインストール後にアップデートでパッチを当てる必要があるためこの仕様になっています。

きっと、独自の手法でアップデートしているんでしょうね。

Windows Installer にはアップデートパッチのサポート機能も含まれていて、その機能を利用したパッチによって増加したファイルなら、アプリケーションのアンインストール時に Windows Installer エンジンが自動的に削除してくれます。これが正道です。

あまり美しい解決ではありませんが、インストーラ作成時に削除したいファイル名が分かっているなら、RemoveFile Table を使って削除できます。

インストーラ作成時に削除したいファイル名が不明な場合でも、ファイル名の規則性くらいは分かっているでしょうから(分からなければお手上げです)、「規則に合致するファイルを削除するカスタムアクション」を作成してインストーラに埋め込めばなんとかなるかもしれません。
再びアドバイスありがとうございます。

> きっと、独自の手法でアップデートしているんでしょうね。

はい。独自のアップデートクライアントを実装し、Web上からダウンロードしています。

> インストーラ作成時に削除したいファイル名が不明な場合でも、ファイル名の規則性くらいは分かっているでしょうから(分からなければお手上げです)、「規則に合致するファイルを削除するカスタムアクション」を作成してインストーラに埋め込めばなんとかなるかもしれません。
>

「規則に合致するファイルを削除するカスタムアクション」とは独自にその機能を実装したexeなりを作成してカスタムアクションから呼び出すということでしょうか?

今回はアップデートされるファイル名(数)がインストール時には不定なため、アップデート時にファイル一覧を作成し、アンインストール時にそれらのファイルを削除するexeを作成 -> そのexeをアンインストールのカスタムアクションで呼び出す、という手法で行うしかないかな?と考えています(実際うまくいったらまた報告します)。
2006/10/15(Sun) 13:15:56 編集(投稿者)
2006/10/15(Sun) 06:44:22 編集(投稿者)

> 「規則に合致するファイルを削除するカスタムアクション」とは独自にその機能を実装したexeなりを作成してカスタムアクションから呼び出すということでしょうか?

そうです。
正確には、.exe または .dll、あるいは WSH スクリプトのいずれかになります。

> 今回はアップデートされるファイル名(数)がインストール時には不定なため、アップデート時にファイル一覧を作成し、アンインストール時にそれらのファイルを削除するexeを作成 -> そのexeをアンインストールのカスタムアクションで呼び出す、という手法で行うしかないかな?と考えています(実際うまくいったらまた報告します)。

カスタムアクションで使用する .dll は、.msi ファイルに埋め込むことが可能です。

一応念のためでコメントしておくと、Windows Installer エンジンおよびその標準の UI はインストール操作の「ロールバック」をサポートしており、カスタムアクションについてもロールバック可能であることを強く求めています。

例えば、アプリケーションのアンインストール処理が開始されたとして、UI 上で「キャンセル」が可能な間はロールバック可能であるのが理想です。

Windows Installer 標準のパッチ機構を使うと、この辺も含めて面倒をみてくれます。

オンラインゲームのように激しくバージョンアップがされ、かつファイル構成も大幅に変わるようなものに関しては、固定的なファイル以外は Windows Instaler エンジンに頼らず、自力でインストール/アンインストール(そしてロールバック)を実装した方が良いのかもしれません。

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