Подтвердить что ты не робот

Как настроить Inno Setup для удаления всего?

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

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

UPDATE

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

Спасибо -

4b9b3361

Ответ 1

Вероятно, вы должны задать совершенно новый вопрос, но я также отвечу на ваш обновленный вопрос. Взгляните на раздел "Паскаль Сценарий: код удаления" в документации по установке 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]).

Ответ 2

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

Как я уже сказал, я не знаю, что такое script, но если вы используете ISTool (очень рекомендую), только что попали в раздел Удалить удаление и добавили вещи, которые вы хотите удалить. Он должен представить все возможные варианты в приятном графическом интерфейсе и создать script для вас.

Изменить: пример из документации Inno Setup:

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Это должно сделать трюк:

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

и отлично работает для меня

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

Ответ 8

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

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