2009-03-13 5 views
16

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

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

UPDATE

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

Спасибо -

+3

Я думаю, что причина, по которой это обычно не возникает, заключается в том, что хорошо выполненное приложение не хранит созданный пользователем контент в своей папке {app}. В рамках модели наименее доступного пользователя фактический пользователь, как правило, не сможет писать там в любом случае. Вот почему папка Application Data существует. – RBerteig

+2

У меня проблема с обновлением моего продукта, который может добавлять новые файлы. Это файлы продуктов, а не файлы данных. Их действительно нужно удалить вместе с продуктом, но во время установки эти файлы были неизвестны. Таким образом, есть законная причина для удаления файлов во время удаления, которые не были установлены там во время установки. – Charles

+1

Если у вас есть случай обновления, обновление должно быть выполнено обновленным установщиком Inno. Таким образом, он автоматически добавит новые файлы, которые будут удалены, и вам не нужно делать ничего особенного. (Помните, что приложение работает как не-админ, а для установки и обновления требуются разрешения администратора, поэтому приложение не может обновить себя, не запуская отдельного установщика с повышенными правами.) – Miral

ответ

10

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

+0

Похоже, никто не щелкнул «НЕТ» в «Вы хотите удалить все файлы данных?». Это не работает! Просто протестирована процедура CurUninstallStepChanged в UninstallCodeExample1.iss –

+2

** Это очень опасно ** ** Это будет рекурсивно удалять содержимое символической папки или точки повторной обработки. ** Я советую а) не использовать эту функцию без изменения проверка атрибутов и b) Innosetup имеет метод 'DelTree()', который просто лучше и безопаснее. Он также снимает любые атрибуты только для чтения, прежде чем удалять и «не входит в» символические ссылки, но удаляет их. –

0

не то, что по умолчанию, если не указать «uninsneveruninstall» для записи?

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

+0

Не верьте этому, он должен только деинсталлировать файлы что он создал и не знает, что создало бы ваше приложение. (Кто-то исправит меня, если я ошибаюсь) – Davy8

+0

Не уверен (опять же, я новичок в Inno Setup), но когда я удаляю наше приложение, он оставляет все созданные новые файлы (и, следовательно, папки существуют). Полагаю, из-за этого папка установки также не удаляется. Спасибо ~ – OneNerd

+0

Если я не ошибаюсь, он удаляет только файлы, которые он создает, и удаляет только папку, если она пуста. Это по умолчанию очень хорошая причина (см. Мой ответ) – Davy8

14

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

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

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

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

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

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

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

+1

Спасибо Дэви ~ так что вы говорите, что нет способа указать, что файлы добавлены ПОСЛЕ удаления установки? – OneNerd

+0

Вы можете просто указать, что это за файлы или папки. – Davy8

+0

.. и если я не знаю, что эти файлы/папки опережают время (чего у меня нет), то я предполагаю, что Кен Уайт провозгласил, что нет никакого способа сделать это? – OneNerd

3

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

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

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

+0

Технически вы можете, но не должны. См. Раздел [UninstallDelete], если вы считаете себя огнеупорным и невосприимчивым к виртуозным мошенникам. Но на самом деле, не делай этого. Он существует, так что приложение, которое теряет такие вещи, как файлы справки при запуске, может их удалить. – RBerteig

+0

Спасибо за исправление. Я никогда не исследовал его на этой глубине, так как я не огнестойкий и непроницаемый. Я также не буду судиться, если моя деинсталляция удалит что-то действительно важное для одного из моих клиентов.

+0

Согласитесь, но как насчет файлов и папок вашего приложения [создает после установки] (http://www.vbforums.com/showthread.php?848531-Installers-and-Uninstalling)? –

4

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

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

+0

Обратите внимание, что в соответствии с правилами Vista + UAC (или предвизовыми ограничениями пользовательских правил) приложение не может обновлять себя непосредственно таким образом, так как это может быть сделано только при запуске установщика с повышенными правами. И если этот установщик с повышенными правами является установщиком Inno Setup, тогда нет проблем - он добавит новые файлы в существующий журнал деинсталляции, и они будут удалены при удалении, как ожидалось. – Miral

4

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

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

От службы поддержки inno он удаляется только в том случае, если он пуст, поэтому он не будет работать: uninsalwaysuninstall Указывает, что деинсталлятор всегда пытается удалить каталог, если он пуст. Обычно деинсталлятор будет пытаться удалить каталог, если он еще не существовал до установки. – htzfun

0

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

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

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

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

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

Вы никогда не должны этого делать. Если пользователь установит ваше приложение на C: \\ Windows, вы удалите ОС при удалении. –

Смежные вопросы