Разработка инсталляторов. Advanced Installer. Урок 13.2. Хитрости поиска файлов и регулярные выражения.



Привет, друзья. Вчера я писал о поиске пути к папке с использованием реестра. Но это не всегда подходит. Как мне справедливо заметили:
Проблема в том, что игра может быть не установлена, а просто распакована. Нужно как-то сделать проверку папки, пользователь которую выбирает как корневую игры, на конкретный файл. При этом если игру не установить, я так понимаю в регистре она не учитывается.
Поясню на счет распакована, то есть человек скачал себе на пк, установил. А потом пришел друг с флешкой и просто скопировал корневую папку на нее и себе на пк перекинул.
Действительно, такой вариант вполне возможен. Некоторые игры или программы в реестр ничего не пишут. Как же поступить в таком случае?
Нам опять же поможет поиск. Заходим в раздел поиска и создаём поиск файла. Переменовываем операцию, например, в STALKER. Нам требуется указать поиск какого-то файла, который нигде кроме папки с игрой быть не может. Например, в папке с игрой S.T.A.L.K.E.R есть файл fsgame.ltx.

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

Добавляем расположение -> Папка.

Никаких папок не указываем (Поле остаётся пустым!). Глубину поиска по вашему выбору. Я поставил 10. То есть какой уровень папок от корневой. После этого название папки изменится на "Все диски".

Теперь перейдём в "Параметры установки" и пропишем в "Папка приложения" свойство поиска [STALKER] (Мы подобное вчера делали).

Соберём проект и запустим готовый инсталлятор. Некоторое время потребуется для поиска файла (У меня прошло минуты три)...

Поиск выполнен и нам предлагает произвести установку в папку....

D:\R.G. Catalyst\S.T.A.L.K.E.R. - Shadow of Chernobyl\fsgame.ltx\
Смущает естественно последнее, то есть \fsgame.ltx\. А нам требуется установить без этой папки (которой вообще не существует, но поиск вывел такое значение на найденный файл, а установщик подхватил как папку). Как же решить этот вопрос? Я прошерстил всю справку и уже начал писать код на PowerShell....который не работал. Пару часов и решение было найдено. Причём встроенными функциями. Заходим на вкладку Настраиваемые действия и находим Process Data. Добавляем его после! операции поиска (Searches).

В параметре "Текст" указываем наше свойство [STALKER], Тип операции - Удаление, что удалять - Другое, а в "Удаление regex" пишем регулярное выражение ([^\\]+$). Его я нагуглил тут. Вывод - Перазаписать. (Можно и по другому, то есть установка нового свойства, пишите там имя нового свойства и указывайте его в параметрах "Параметры установки"). Условие этапа установки - только "Установка".

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

Путь указан верно - D:\R.G. Catalyst\S.T.A.L.K.E.R. - Shadow of Chernobyl. Всё получилось!
Немного изменим условия поиска.
А если нам потребуется найти, например, файл XR_3DA.exe (Это основной исполняемый файл игры), который находится в папке bin в папке с игрой, а установку модификации всё равно требуется произвести в корневую папки игры, а не в bin?

Меняем в поиске fsgame.ltx на XR_3DA.exe.

Добавляем перед нашим регулярным выражением на удаление \\bin\\. То есть получится следующее: \\bin\\([^\\]+$).

Результат аналогичен - установка пойдёт куда нам и требуется.

На этом всё. Если что-то не получается - пишите. Буду искать решение. Спасибо за внимание и пооддержку и хорошего вечера!


Comments 0