24

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

私はここと彼らのフォーラムで狩りをしましたが、空っぽになりました。これを行う方法に関するドキュメント、FAQなどを誰かに教えてもらえますか?

アップデート

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

ありがとう -

4

9 に答える 9

17

推奨されるアプローチは、アンインストール セクションで何を削除するかを指定することだと思います。その理由は、何らかの理由で、ユーザーが削除したくない自分のファイルや保存したいデータをインストール ディレクトリに置くことを決定した場合 (おそらく、新しいバージョンをインストールするためにアンインストールすることでしょうか? )

そうは言っても、スクリプトが何であるかはわかりませんが、ISTool (強くお勧めします) を使用する場合は、アンインストール 削除セクションに移動して、削除したいものを追加してください。考えられるすべてのオプションが素敵な GUI に表示され、スクリプトが生成されます。

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

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

しかし、彼らは強く、あなたは次のようなことをしません

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

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

于 2009-03-13T16:45:28.267 に答える
12

おそらくこれをまったく新しい質問にする必要がありましたが、更新された質問にもここで回答します。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]のエントリを使用)。セクション)。

于 2009-03-16T09:55:55.460 に答える
6

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

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

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 にインストールしたユーザーの場合を考えてみましょう。

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

于 2011-03-19T04:04:44.970 に答える
4

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

[Dirs]
Name: "{app}"; Flags: uninsalwaysuninstall
于 2013-09-18T05:00:41.527 に答える
4

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

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

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

于 2009-03-13T16:51:24.133 に答える
1

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

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

于 2009-03-13T16:36:48.227 に答える
-1

私がこれを使用するすべてを削除するには:

[UninstallDelete]
Type:files; Name: "{app}"
于 2015-03-12T11:34:23.830 に答える