WiX сохраняет старые файлы данных, хранящиеся в ProgramFiles

Я адаптировал программу, чтобы она больше не нуждалась в правах администратора или не записывала файлы данных в ее установочный каталог 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 или нет)?
  • Является ли это копирование лучшим или наименее плохим способом достижения моей первоначальной цели?

Спасибо заранее.


person J.P.    schedule 02.11.2015    source источник


Ответы (1)


Хорошо, после прочтения авторитетных ответов на другой вопрос, я еще раз подтвердил, что такого рода это не подходит для установки установщиком.

Просто для информации, это пакетный скрипт Windows, который я буду использовать вместо него (до InstallFiles):

@echo off

if exist "%APPDATA%\authorName\prodName\Foo.bar" exit /b 0

set dirOrig=0
if exist "%ProgramFiles(x86)%\prodNameOld\DATABASE\Foo.bar" set dirOrig=%ProgramFiles(x86)%\prodNameOld\DATABASE
if exist "%ProgramFiles(x86)%\prodName\DATABASE\Foo.bar"    set dirOrig=%ProgramFiles(x86)%\prodName\DATABASE
if "%dirOrig%"=="0" exit /b 0

xcopy "%dirOrig%\Foo.bar" "%APPDATA%\authorName\prodName\" /y 
xcopy "%dirOrig%\etc.*"   "%APPDATA%\authorName\prodName\" /y
del /f/q "%dirOrig%\*.*"
exit /b 0
person J.P.    schedule 06.11.2015