web-dev-qa-db-ja.com

すべてをアンインストールするようにInno Setupを構成する方法は?

Inno Setupは初めてです。 1つの問題、つまり、アプリケーションによって作成されたすべてのファイル、フォルダー、サブフォルダー、さらには新しいファイル/フォルダーなどを削除するようにアンインストールピースを構成する方法(つまり、アプリケーションと関連ファイルの100%の削除)。

私はここと彼らのフォーラムで探し回り、空っぽになりました。誰かが私に文書を指摘してもらえますか、FAQなど、これを行う方法について?

[〜#〜]更新[〜#〜]

これまでのすべてのフィードバックに感謝します(非常に素晴らしい)。したがって、アンインストールセクションで{app} *。*ディレクティブを使用してすべてを削除できるようです。また、誰もが反対しているようです。 これで質問は次のようになります(これがまったく新しい質問になるかどうか疑問に思っています)には、アンインストール中にユーザーに「これに関連付けられているすべてのプロジェクトファイルを削除しますか?応用?'そして、彼らが「はい」と答えた場合、アンインストール{app} *。*ピースを実行しますか?

ありがとう-

21
OneNerd

あなたはおそらくこれをまったく新しい質問にすべきでしたが、更新された質問にもここで答えます。 Inno Setup Documentationのセクション"Pascal Scripting:Uninstall Code"をご覧ください。

アンインストールプロセスの一部としてデータファイルを条件付きで削除する方法の例を示します。

[Code]

procedure DeleteBitmaps(ADirName: string);
var
  FindRec: TFindRec;
begin
  if FindFirst(ADirName + '\*.*', FindRec) then begin
    try
      repeat
        if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then begin
          if (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin
            DeleteBitmaps(ADirName + '\' + FindRec.Name);
            RemoveDir(ADirName + '\' + FindRec.Name);
          end;
        end else if Pos('.bmp', AnsiLowerCase(FindRec.Name)) > 0 then
          DeleteFile(ADirName + '\' + FindRec.Name);
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then begin
    if MsgBox('Do you want to delete all data files?', mbConfirmation,
        MB_YESNO) = IDYES 
    then begin
      DeleteBitmaps(ExpandConstant('{app}'));
    end;
  end;
end;

ただし、クリーンアップする必要があるものの量によっては、インストールの一部であり、アプリのアンインストール中に実行できる特別なヘルパープログラムを作成した方がよい場合があります(([UninstallRun]セクション)。

12
mghie

アンインストールセクションで削除するものを指定することをお勧めします。その理由は、ユーザーが何らかの理由でインストールディレクトリに自分のファイルを削除したくない、または保存したいデータを保存したいと考えた場合です(おそらくアンインストールは新しいバージョンをインストールすることですか?) )

そうは言っても、私はスクリプトが何であるかわかりませんが、ISTool(強く推奨)を使用している場合は、[削除の削除]セクションに移動して、削除するものを追加します。 Nice GUIで可能なすべてのオプションを提示し、スクリプトを生成します。

編集:Inno Setupドキュメントの例:

[UninstallDelete]
Type: files; Name: "{win}\MYPROG.INI"

しかし、彼らはあなたが次のようなことをしないことを強く望みます

[UninstallDelete]
Type: files; Name: "{app}\*.*"

注:ここでワイルドカードを使用して、{app}ディレクトリ内のすべてのファイルを削除するように誘惑されないでください。 2つの理由でこれを行わないことを強くお勧めします。まず、ユーザーは通常、アプリケーションディレクトリに配置したデータファイルを警告なしに削除してもらえません(たとえば、別のドライブに移動したいためにアンインストールしているだけかもしれません)。必要に応じてエンドユーザーが手動で削除することをお勧めします。また、ユーザーが誤ってプログラムを間違ったディレクトリ(たとえば、C:\ WINDOWS)にインストールしてからアンインストールした場合、悲惨な結果になる可能性があります。繰り返しますが、これを行わないでください!

16
Davy8

インストール時に最初にユーザーのディスクに書き込まれなかったファイルを削除したい場合があります。これらのケースの1つは、起動時に自身を更新するアプリケーションがある場合です。この方法で、アンインストーラーの一部ではない新しいファイルをディスクに追加できます。

この場合、{app}ディレクトリにあるべきファイルの実行記録を保持する「パッチマニフェスト」ファイルを作成することをお勧めします。 「patch_manifest.txt」という{app}ディレクトリのファイルから読み取るコードのサンプルを以下に示します

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  i: Integer;
  arrayLen: Longint;
  item: String;
  itemsToDelete: Array of String;
begin
  case CurUninstallStep of
    usUninstall:
      begin
        LoadStringsFromFile(ExpandConstant('{app}') + '\patch_manifest.txt', itemsToDelete);
        arrayLen := GetArrayLength(itemsToDelete);
        for i := 0 to arrayLen-1 do
          begin
          item := ExpandConstant('{app}') + '\' + itemsToDelete[i];
          if FileExists(item) then
            DeleteFile(item);
          if DirExists(item) then
            RemoveDir(item);
          end;
      end;
  end;
end;

そしてpatch_manifest.txtのサンプル

data/something_here.dat
data/moredatahere.dat
data/
Launcher.exe
patch_manifest.txt

注:patch_manifestの行の順序は重要です。ディレクトリ内のすべてのファイルを最初にリストし、次にディレクトリをリストする必要があります。空でないディレクトリは削除できません。

アプリケーションはpatch_manifestとともに出荷され、patch_manifestはすべてのパッチで更新される必要があります。ビルドプロセスのこの部分を作成して、更新することを忘れないでください!

ユーザーにプロンプ​​トを表示する場合でも、ワイルドカード()で削除しないことが非常に重要です。アンインストーラーには昇格された特権があり、ユーザーのコンピューターを破壊する可能性があります。アプリケーションを誤ってC:\ Windows \またはC:\ Program Filesにインストールしたユーザーのケースを取り上げます。

別の良いアイデアは、削除する前にMD5チェックを実行して、ファイルが実際に「自分のファイル」であることを確認することです。この場合、patch_manifest.txtには、ファイルへの相対パスだけでなく、MD5チェックサムも含まれます。

6
reset

InnoSetupを使用して、インストールされなかったものをアンインストールすることはできません。また、アンインストールする必要もありません。アプリケーションをインストールし、大量のデータを入力して、代わりにアプリからそのデータを読み取る別の何かを使用することにした場合、私は1つは非常に不幸です。アンインストールで既に行った作業がすべて終了してしまった場合、私はあなたを探しに来たくなるかもしれません。そしておそらくあなたに一杯のコーヒーを買わないでください。

または、いくつかの評価プロセスでアプリケーションをインストールする場合を考えてみます。私はアプリを試してみて、あなたのアプリに戻っていきます。少し気に入ったからです。データを入力するたびに。それからしばらくは何もしないことにしたので、すべてのテストアプリを削除します。 1週間後、結局アプリを使用する必要があると判断し、再インストールします。おっとっと!テストした結果、使用したかった作業はすべてなくなりました。

上記は、アプリケーションをアンインストールするときに、構成ファイル、データファイルなど、フォルダーに作成したものを残しておく理由です。アプリケーションで何をしたいのかわからないので、そのままにしておきます。

4
Ken White

これでうまくいくはずです:

[Dirs]
Name: "{app}"; Flags: uninsalwaysuninstall
4
Scoox

Inno Setup Studioでファイル/フォルダーの削除項目を追加します。または、次のように直接スクリプトを使用します。

[生成されたコードサンプル]

[UninstallDelete]
Type: filesandordirs; Name: "{app}\unnecessary_files"
1
Naveen Kumar V

削除したかったgData.dat実行時にインストールされたフォルダに作成されました

そして私のためにうまく働いていた

[UninstallDelete]
Type: files; Name: "{app}\gData.dat"
1
Salim

エントリに「uninsneveruninstall」を指定しない場合、それがデフォルトではありませんか?

編集-申し訳ありませんが、新しく作成されたデータファイルについて話していることに気づきませんでした。

1
Martin Beckett