Inno setup удалить файлы

Обновлено: 06.07.2024

Это мощное средство для создания установочных пакетов (дистрибутивов) программ. Поддерживается шифрование, установка пароля, различные задачи по завершении установки. Можно создавать свои страницы, используя Inno Setup Form Designer.
По сравнению с NSIS (основной конкурент на бесплатной основе) проще в настройке, имеет более понятную структуру скрипта.

Руководство по расширенным возможностям Inno Setup 5 (не для чайников) от Kindly
Версия 5. 1 скачать || версия 5 скачать|зеркало || версия 4 скачать|зеркало || версия 3 скачать|зеркало

Inno Setup Extensions Knowledge Base (содержит ответы на многие вопросы)
Новая версия (Web-интерфейс) || Старая chm-версия скачать | зеркало

Коллекция скриптов и Сборник вопросов , собранных из этой и предыдущих частей топика.

Примечание: Если необходимо использовать метод проверки внешнего файла через сумму MD5 (который описан в 5 версии руководства от Kindly) для запуска инсталлятора, то понадобится калькулятор хеша MD5, калькулятор сумм MD5, SHA-256, CRC32. Если требуется узнать, какие ключи реестра меняет та или иная программа, используйте RegShot. Чтобы растянуть фоновый рисунок на весь экран, в версии Inno Setup 5.1. 10 и выше используйте этот код.

Мощная надстройка для Inno Setup, при помощи которой создавать свои инсталляторы становится очень просто.

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

Прежнее название ScriptMaker. Удобная оболочка для облегчения написания скриптов установки для Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.

Распаковщик установок, сделанных с помощью Inno Setup. При распаковке извлекаются ресурсы и скрипт установки (немного усечённый). Возможно подключение к Total Commander или FAR с помощью MultiArc плагинов.
Поддерживает распаковку инсталляторов, сделанных с помощью Inno Setup начиная с версии 3.0.0-beta по 5. 2.3

Спасибо, я уже догодался, методом тыка.

Добавлено:
Видимо это происходит из-за того, что строка начинается с пробела.

Такой вопрос: препроцессор можно использовать для компиляции дистрибутивов и без его прямого назначение, то есть там, где он использоваться не будет или лучше им пользоваться для компиляции дистрибутивов там где он нужен, как в моем случае?

Я тоже не могу понять твоей "нужды". А какая тебе разница если компилятор использует препроцессор или нет? Ты эту разницу разве видишь?!
Инсталлятор будет выполнять именно то, что ты ему скажешь, "лишнего" он ничего не будет делать. (за исключением инструкций по умолчанию).

Так как же мне заставить удалятся всю папку с подкаталогами после установки? Почему не срабатывает способ с deleteafterinstall.

Ну, в этом случае думаю безопасно будет использовать DelTree

Работает. А можно сделать, чтобы оно дождалось удаления, после чего только закрывался инсталлятор, в моем случае переходит на страничку с просьбой перезагрузиться?

Добавлено:
Да, вот еще: как в этот код дописать удаления файлов по маске:

Попробуй CurStep = ssPostInstall

если только логи, вот пример удаления по маске

У Тебя это какой-то мод для Сталкера?
Если для установки нужна оригинальная игра, то проще (и надо) определять её наличие на этапе инициализации инсталлятора.


Mitnadev
Они всегда пользовались NSIS.

Добавлено:

Метод тыка рулит!
Вот так теперь работает:

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

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

обновление

Спасибо за все отзывы до сих пор (очень высокий). Похоже, я могу удалить все, используя *.* директивы в разделе "удаление". Также похоже, что все против этого. таким образом, вопрос теперь становится (мне интересно, должен ли это быть совершенно новый вопрос) есть ли способ во время удаления, что мы можем спросить пользователя " вы хотите удалить все файлы проекта, связанные с этим приложением?"и если они ответят "да", запустите uninstall *.* кусок?

вы, вероятно, должны были сделать это совершенно новым вопросом, но я отвечу на ваш обновленный вопрос здесь. Взгляните на раздел "Pascal Scripting: Uninstall Code" в документации по настройке Inno.

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

но в зависимости от количества вещей, которые вы должны убирать вы, может быть, лучше создать специальную вспомогательную программу, которая часть установки, и которая может быть выполнена во время удаления приложения (с помощью записи в [UninstallRun]).

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

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

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

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

примечание: не соблазняйтесь использовать подстановочный знак здесь, чтобы удалить все файлы в в . Я сильно не рекомендую делать это за двоих причины. Во-первых, пользователи, как правило, Не ценят их файлы данных они помещаются в каталог приложений удалены без предупреждения (они могут только удалить его, потому что они хотите переместить его на другой диск, например.) Лучше оставить его до конечных пользователей, чтобы вручную удалить они, если хотят. Также, если пользователь получилось установить программу в неверный каталог по ошибке (по например, C:\WINDOWS) а затем отправился в удалить его там может быть катастрофическим последствия. Так еще раз, не делай этого!

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

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

и образец patch_manifest.txt

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

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

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

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

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

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

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

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

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

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

Для установки и развертывания моего приложения я использую Inno-Setup 5.5.4. Моя текущая структура установки следующая:

После удаления приложения я хочу удалить все возможные файлы, которые могут быть созданы приложением, кроме тех, которые находятся в определенной папке. (т.е. C:\MyApp\FolderA\NewFile.txt ).

Моя первая попытка - создать по одной записи для каждой папки, которую я хочу очистить, в разделе [UninstallDelete]. Примерно так:

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

Второй подход - удалить конкретную папку, только если она пуста, а затем установить корневую папку приложения для удаления. Примерно так:

Будет ли работать этот второй подход? Есть ли более разумный способ добиться этого?

2 ответа

Файл не может быть удален, когда к нему обращается процесс. Найдите причину, которая его вызывает. Закройте все приложения и службы, которые собираются удалить до начала удаления папок. Убедитесь, что нет других приложений, обращающихся к файлам, которые вы собираетесь удалить (блокнот, Word и т. Д.). Иногда полезно подождать несколько секунд после завершения других процессов, прежде чем удалять файлы, которые они использовали (может быть, кто-то еще может объяснить это).

У меня однажды был случай, когда мы не могли найти причину, по которой файл не может быть удален деинсталлятором. Спустя долгое время мы обнаружили, что запущенный apachemonitor.exe обращается к файлу журнала, и мы не убивали этот процесс раньше. Найти блокирующий процесс может быть довольно сложно, но особенно если это всегда один и тот же файл, который нельзя удалить, вам лучше поискать процессы, которые вы устанавливаете и используете, чтобы создать правильно работающий деинсталлятор.

Вы можете использовать FindFirst , FindNext , FindClose для перебора каталога. Звоните DelTree(DirName, true, true, true) или DeleteFile , чтобы узнать все элементы, которые вы хотите удалить.

Выполните этот код внутри события CurUninstallStepChanged , если CurUninstallStep=usPostUninstall .

Другой способ предотвратить удаление файлов при удалении - используйте параметр Flags:

uninsneveruninstall; в разделе [Файлы]

Информация из справки:

Никогда не удаляйте файл. Этот флаг может быть полезен при установке очень распространенных общих файлов, которые не следует удалять ни при каких обстоятельствах, таких как библиотеки DLL MFC.

Примечание : если этот флаг сочетается с флагом sharedfile, файл никогда не будет удален во время удаления, но счетчик ссылок все равно будет правильно уменьшен.

как настроить uninstall piece для удаления всех файлов, папок, подпапок и даже новых файлов/папок и т. д., созданных приложением (другими словами, a 100% удаление приложения и связанных с ним файлов).

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

UPDATE

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

Как настроить группу безопасности Windows в рамках установки Inno Setup? Кажется, я не могу придумать правильный текст для google, чтобы понять это. Возможно, намека на то, что искать, будет достаточно.

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

Тем не менее, я не знаю навскидку, что это за скрипт, но если вы используете ISTool (настоятельно рекомендую), просто перейдите в раздел Uninstall Delete и добавьте то, что вы хотите удалить. Он должен представить все возможные варианты в приятном GUI и сгенерировать сценарий для вас.

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

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

NOTE: не поддавайтесь искушению использовать здесь подстановочный знак для удаления всех файлов в каталоге . Я решительно рекомендую не делать этого по двум причинам. Во-первых, пользователи обычно не ценят наличие своих файлов данных они помещают в каталог приложений удаленные без предупреждения (они могут удаляйте его только потому, что они хотят переместить его на другой диск, например). Лучше оставить это до конечных пользователей, чтобы вручную удалить их, если они хотят. Кроме того, если пользователь случайно установил программу в неправильный каталог по ошибке ( например, C:\WINDOWS) , а затем перешел в удаление его может иметь катастрофические последствия. Так что, повторяю, Не делай этого!

Вероятно, вам следовало бы сделать этот вопрос совершенно новым, но я отвечу и на ваш обновленный вопрос здесь. Взгляните на раздел "Pascal Scripting: Uninstall Code" в документации по установке Inno.

Приведем пример условного удаления файлов данных в процессе деинсталляции:

Но в зависимости от количества вещей, которые вам нужно очистить, вам может быть лучше создать специальную вспомогательную программу, которая является частью установки и которая может быть выполнена во время удаления приложения (используя запись в разделе [UninstallRun] ).

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

Для этого случая я предлагаю вам создать файл "patch manifest", который хранит текущую запись о том, какие файлы должны быть в каталоге . Ниже приведен пример кода, который считывается из файла в каталоге под названием 'patch_manifest.txt'.

и образец patch_manifest.txt

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

Ваше приложение должно быть отправлено с patch_manifest, и patch_manifest должен обновляться с каждым патчем. Сделайте это частью вашего процесса сборки, чтобы вы не забыли обновить его!

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

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

У меня есть созданный установщик с помощью Inno setup. Эта установка устанавливает мое приложение как службу .when я пытаюсь удалить свое приложение, оно удаляет папку, но я просто хочу, чтобы оно сначала искало конкретную службу и удаляло ее, а затем выполняло процедуру удаления.

Читайте также: