Как настроить Inno Setup, чтобы удалить все? - PullRequest
20 голосов
/ 13 марта 2009

Я новичок в Inno Setup. Застрял в одном вопросе ~ как настроить часть удаления для удаления всех файлов, папок, подпапок и даже новых файлов / папок и т. Д., Созданных приложением (другими словами, 100% удаление приложения и связанных файлов).

Я охотился здесь, а также на их форуме, и пришел пустым. Кто-нибудь может указать мне документ, FAQ и т. Д. Относительно того, как это сделать?

UPDATE

Спасибо за все отзывы (очень круто). Похоже, я могу удалить все, используя директиву {app} *. * В разделе удаления. Также похоже, что все советуют против этого. Таким образом, вопрос теперь становится (мне интересно, должен ли это быть совершенно новый вопрос), есть ли способ во время удаления, который мы можем задать пользователю: «Вы хотите удалить все файлы проекта, связанные с этим приложением?» ? и если они ответят ДА, запустить деинсталляцию {app} *. * piece?

Спасибо -

Ответы [ 9 ]

15 голосов
/ 13 марта 2009

Я думаю, что рекомендуемый подход - указать, что нужно удалить в разделе удаления. Причина заключается в том, что если пользователь по какой-либо причине решил поместить в каталог установки свои собственные файлы, которые он не хотел удалять, или сохранил данные, которые он может захотеть сохранить (может быть, их удаление означает установку более новой версии? )

При этом я не знаю, что это за сценарий, но если вы используете ISTool (очень рекомендую), то просто попали в раздел «Удалить удаление» и добавили то, что хотите удалить. Он должен представить все возможные варианты в хорошем графическом интерфейсе и сгенерировать скрипт для вас.

Редактировать: пример из документации по установке Inno:

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

Но они сильно не делают что-то вроде

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

ПРИМЕЧАНИЕ. Не пытайтесь использовать здесь подстановочный знак для удаления всех файлов в каталог {app}. Я настоятельно рекомендую не делать этого на двоих причины. Во-первых, пользователи обычно не ценю наличие их файлов данных они помещают в каталог приложений удаляются без предупреждения (они могут только удалить его, потому что они хочу переместить его на другой диск, например). Лучше оставить до конечных пользователей, чтобы удалить вручную их, если они хотят. Также, если пользователь случилось установить программу в неправильный каталог по ошибке (для например, C: \ WINDOWS) и затем удалить его может быть катастрофическим последствия. Итак, еще раз, НЕ ДЕЛАЙТЕ ЭТОГО!

11 голосов
/ 16 марта 2009

Возможно, вам следовало сделать этот вопрос совершенно новым, но я также отвечу на ваш обновленный вопрос здесь. Взгляните на раздел «Сценарии Паскаля: код удаления» в документации по установке Inno.

Чтобы привести пример того, как условно удалить файлы данных в процессе удаления:

[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] section).

5 голосов
/ 19 марта 2011

В некоторых случаях требуется удалить файлы, которые изначально не были записаны на диск пользователя во время установки. Один из таких случаев - когда у вас есть приложение, которое обновляется при запуске. Таким способом на диск можно добавлять новые файлы, которые не являются частью деинсталлятора.

Для этого случая я предлагаю вам создать файл "патча-манифеста", в котором хранятся записи о том, какие файлы должны находиться в каталоге {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 должен обновляться с каждым патчем. Сделайте это частью вашего процесса сборки, чтобы не забыть обновить его!

Очень важно, чтобы вы не удаляли с помощью подстановочного знака (. ), даже если вы предлагаете пользователю. У Uninstaller есть повышенные привилегии, которые могут потенциально уничтожить компьютер пользователя. Возьмите случай с пользователем, который случайно установил ваше приложение в C: \ Windows \ или C: \ Program Files.

Еще одна хорошая идея - проверить, что файл на самом деле является «вашим файлом», выполнив проверку MD5 перед его удалением. В этом случае ваш patch_manifest.txt будет включать не только относительный путь к файлу, но и контрольную сумму MD5.

4 голосов
/ 18 сентября 2013

Это должно сработать:

[Dirs]
Name: "{app}"; Flags: uninsalwaysuninstall
3 голосов
/ 13 марта 2009

Вы не можете использовать InnoSetup для удаления чего-либо, что не было установлено, и вам не следует этого делать. Я, например, был бы очень недоволен, если бы я установил приложение, ввел много данных, а затем решил использовать вместо этого что-то еще, что будет считывать эти данные из вашего приложения. Если твоя деинсталляция убила всю работу, которую я уже сделал, я мог бы соблазниться, чтобы найти тебя. И, вероятно, не купить вам чашку кофе.

Или рассмотрим случай, когда я устанавливаю ваше приложение в процессе оценки нескольких. Я пробую приложения и продолжаю возвращаться к вашим, потому что они мне нравятся немного лучше, и каждый раз я ввожу больше данных. Затем я решил ничего не делать, поэтому удаляю все тестовые приложения. Через неделю я решаю, что теперь мне нужно использовать ваше приложение, и переустанавливаю его. К сожалению! Вся работа, которую я выполнял, тестируя ее, которую я теперь хотел использовать, ушла.

Вышесказанное объясняет, почему при удалении приложения оно оставляет после себя все, что вы создали в папках, например файлы конфигурации, файлы данных и т. Д. их одни.

1 голос
/ 14 ноября 2018

Добавить удаление файла / папки в Inno Setup studio. Или напрямую используйте скрипт следующим образом.

[Образец сгенерированного кода]

[UninstallDelete]
Type: filesandordirs; Name: "{app}\unnecessary_files"
1 голос
/ 17 февраля 2015

Я хотел удалить gData.dat, созданный во время выполнения в установленной папке

и у меня все работало нормально

[UninstallDelete]
Type: files; Name: "{app}\gData.dat"
0 голосов
/ 12 марта 2015

Чтобы удалить все, я использую это:

[UninstallDelete]
Type:files; Name: "{app}"
0 голосов
/ 13 марта 2009

Разве это не значение по умолчанию, если вы не указываете "uninsneveruninstall" для записи?

edit - Извините, я не понял, что вы говорите о недавно созданных файлах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...