Я адаптировал программу, чтобы она больше не нуждалась в правах администратора или не записывала файлы данных в ее установочный каталог Programfiles. Эти файлы не создаются программой, а модифицируются: они существуют в новой установке, даже если они были пустыми (в любом случае это не совсем так).
Теперь мне нужно адаптировать установщик, под дополнительное требование, что, если есть файлы от предыдущей версии, я должен их как-то сохранить, чтобы программа использовала их вместо дефолтных. Предыдущий MSI (не созданный с помощью WiX) оставляет эти файлы после удаления.
Мое решение для самой программы состояло в том, чтобы установить файлы данных по умолчанию непосредственно в INSTALLFOLDER/programfiles, как и раньше, но проверять внутри программы при каждом запуске, существуют ли файлы в appdata, в противном случае копируйте свежие файлы из programfiles, а затем начните использовать новые дорожка. Я делаю это, потому что я все еще хочу, чтобы это были данные для каждого пользователя, но я не могу полагаться на установку для хранения файлов в каждом текущем и будущем профиле пользователя; и я думаю, что MSI не должна этого делать. (Кстати, я ошибаюсь здесь?)
Теперь, что касается установки, эффект, который, по моему мнению, был бы лучшим, заключается в том, чтобы продолжать устанавливать свежие файлы данных в файлы программ, но MSI перемещает существующие файлы, если они есть (если в файлах программ нет файлов данных, установка должна просто продолжаться) в appdata ( поэтому они будут найдены и использованы программой для пользователя, который установил). Вишенкой на торте будет разрешение конфликта в случае, если файлы будут найдены как в файлах программ, так и в данных приложения (я должен предположить, что последнее будет более поздним).
Это моя первая попытка:
<Directory Id="AppDataFolder">
<Directory Id="appdataDirAuthor" Name="authorName">
<Directory Id="appdataDir" Name="productName">
<Component Id="dbPreserve" Permanent="yes" Guid="XXXXXX">
<CopyFile Id="dbPreserveFoo" Delete="yes" DestinationDirectory="appdataDir" SourceDirectory="dbDir" SourceName="Foo*.*" />
</Component>
</Directory>
</Directory>
</Directory>
Конечно, я получаю сообщения об ошибках, что я должен использовать реестр KeyPath и что мне не хватает RemoveFile. Но то, что я хочу, это одноразовая копия, и мне не нужно или я не хочу, чтобы ОС отслеживала ее, потому что я просто имитирую, как файлы будут оставлены в данных приложения самим программным обеспечением, что деинсталляция не будет трогать.
Возможно, это лучше подходит для специального сценария вне MSI, запускаемого с помощью настраиваемого действия?
- как лучше всего выполнить копирование этого файла (с помощью стандартных действий MSI или нет)?
- Является ли это копирование лучшим или наименее плохим способом достижения моей первоначальной цели?
Спасибо заранее.