【问题标题】:WiX preserve old data files stored in ProgramFilesWiX 保留存储在 ProgramFiles 中的旧数据文件
【发布时间】:2015-11-02 16:50:26
【问题描述】:

我已经修改了一个程序,使其不再需要管理员权限或将数据文件写入其安装程序文件目录。这些文件不是由程序创建而是被修改的:它们存在于全新安装中,即使它们是空的(实际上并非如此)。

现在我需要调整安装程序,以满足附加要求,如果有来自以前版本的文件,我必须以某种方式保留它们,因此程序使用它们而不是默认文件。以前的 MSI(不是用 WiX 制作的)在卸载后会留下这些文件。

我对程序本身的解决方案是像以前一样将默认数据文件直接安装到 INSTALLFOLDER/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。但是我想要的是一次性副本,我不需要或不希望操作系统跟踪它,因为我只是在模仿软件本身如何将文件留在 appdata 中,卸载不会触摸。

也许这更适合通过自定义操作在 MSI 之外运行的临时脚本?

  • 完成此文件复制的最佳方法是什么(通过或不通过 MSI 标准操作)?
  • 这种复制是实现我最初目标的最好还是最不坏的方法?

非常感谢。

【问题讨论】:

    标签: wix appdata file-copying


    【解决方案1】:

    嗯,看了this other question的权威回答,再次确认这种事情不适合安装人员做。

    仅供参考,这是我将使用的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多