Как установить фильтр при распаковке файлов
В процессе инсталляции программы может возникнуть такая ситуация, когда необходимо установить только определенные файлы в зависимости от опций, указанных пользователем. В этом случае можно воспользоваться параметром Условие в команде Установочные файлы, но что делать если условия могут быть сложные, файлов много и возникают трудности с разбивкой файлов на отдельные команды. В этом случае, инсталлятор CreateInstall позволяет установить функцию фильтр на распаковку файлов. Данная функция будет вызываться для всех устанавливаемых файлов и вы можете возвратить 1, если файл нужно установить и 0, если указанный файл необходимо пропустить. Рассмотрим подробнее создание и привязку такой функции-фильтра.
Шаг 1
Добавьте в Дополнительные параметры команды Установочные файлы переменную Xfilter. В качестве значения укажите имя ваше функции фильтра. Следует заметить, что имя должно оканчиваться на cmdproc!
Xfilter => myfiltercmdproc
Шаг 2
Добавьте команду Исходный код в начало вашего скрипта установки. Отметьте чекбокс 'Внешний код'. Также вы можете воспользоваться уже добавленной командой Исходный код, если такая уже существует в вашем скрипте. Добавим туда шаблон нашей функции.
func uint myfiltercmdproc( geafile gf ) { return 1 }
В данном случае, наш фильтр ничего не делает и будет разрешать распаковывать все файлы. Рассмотрим поля в передаваемой структуре geafile. Она содержит информацию об устанавливаемом файле.
type geafile { filetime ft // File time uint size // File size uint attrib // File attribute uint hiver // Hi version uint lowver // Low version str name // the name of the file str subfolder // the name of the subfolder }
Шаг 3
Сейчас можно определить какой-нибудь фильтр. Например, напишем пример, который будет запрещать устанавливать .jpg файл, если переменная nojpg равна 1.
func uint myfiltercmdproc( geafile gf ) { if macrox_getint( "nojpg" ) { str ext = gf.name.fgetext() ext.lower() if ext == "jpg" : return 0 } return 1 }
При желании, можно менять имя файла name и директорию установки subfolder в переменной gf.