Wix - 卸载删除文件但不删除文件夹

Posted

技术标签:

【中文标题】Wix - 卸载删除文件但不删除文件夹【英文标题】:Wix - uninstall remove files but not folders 【发布时间】:2014-10-14 06:25:39 【问题描述】:

我使用 heat cmd 创建了一个 wix 安装程序。 卸载时,所有文件都被删除,但并非所有文件夹都被删除。 这是我的代码的相关部分:

    <Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="$(var.PlatformProgramFilesFolder)">
    <Directory Id="companyDir" Name="companyName">
      <Directory Id="INSTALLFOLDER" Name="AppName">
        <Directory Id="INSTALLDIR" >
          <Directory Id="bin" Name="bin">
          <!-- Auto-start via Registry -->
          <Component Id="AppNameAutoStartUp" Guid="MYGUID">
            <Condition>AUTOMATIC_START_UP=1 OR Installed</Condition>
              <RegistryValue Id="App.rst" Root="HKCU" Action="write" Key="Software\Microsoft\Windows\CurrentVersion\Run" Name="AppName" Value="[#AppName.exe] -sc" Type="string" />
          </Component>

          </Directory>
        <Directory Id="docs" Name="Docs">
        </Directory>
        </Directory>
      </Directory>
    </Directory>
  </Directory>
  <Directory Id="CommonAppDataFolder">
    <Directory Id="ConfCompanyDir" Name="Company">
      <Directory Id="CONFINSTALLFOLDER" Name="AppName">
        <Directory Id="CONFINSTALLDIR" >
          <Directory Id="conf" Name="conf">
          </Directory>
        </Directory>
      </Directory>
    </Directory>
  </Directory>
  <!-- Shortcuts and Directories for Shortcuts -->
  <Directory Id="ProgramMenuFolder" Name="Programs">
    <Directory Id="ProgramMenuDir" Name="AppName">
      <Component Id="ProgramFilesShortcut" Guid="MYGUID">
        <Condition>DESKTOP_SHORTCUT = 1</Condition>
        <Shortcut Id="desktopAppName" Directory="DesktopFolder" Name="AppName" Target="[#AppName.exe]" WorkingDirectory="bin" Icon="AppIcon.ico">
        </Shortcut>
        <RemoveFolder Id="ProgramFilesShortcut" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Name="installed" Type="integer" Value="1" KeyPath="yes" />
      </Component>
      <Component Id="ProgramMenuDir" Guid="MYGUID">
          <Shortcut Id="startmenuAppName" Directory="ProgramMenuFolder" Name="AppName" Target="[#AppName.exe]" Icon="AppIcon.ico" WorkingDirectory="bin" Arguments="-s">
          <!-- Set the AppID in order to get toasts to work -->
          <ShortcutProperty Key="System.AppUserModel.ID" Value="Company.AppName" />
        </Shortcut>
        <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Name="installed" Type="integer" Value="1" KeyPath="yes" />
      </Component>
    </Directory>
  </Directory>
  <Directory Id="DesktopFolder" Name="Desktop" />
</Directory>

卸载时会删除 Docs 文件夹,但不会删除 bin 文件夹(虽然它是空的,但所有文件都已删除)。 有谁知道为什么它没有被删除?

【问题讨论】:

【参考方案1】:

我在你的 Feature 元素中添加了这样的代码:

<Component Directory='INSTALLDIR'>
  <RemoveFolder Id='CleanupApplicationFolder' On='uninstall' />
</Component>

所以你应该更改 INSTALLDIR主文件夹(它应该全部卸载)。

【讨论】:

我不确定我是否理解您的回答。我试图像这样在我的行之间添加你的行:(但它不起作用) Directory="INSTALLFOLDER"设置为那个组件然后尝试 我无法设置 Directory 属性,因为它嵌套在 Directory 元素下。如果尝试这样做,我会收到编译错误。 哦,对不起,我忘了提,将其添加到功能元素中 ^^ &lt;Feature Id='TestProductFeature' Title='Wix File Product Feature' Level='1'&gt;&lt;RemoveFolder Id='CleanupApplicationFolder' On='uninstall' /&gt;&lt;/Component&gt;&lt;/Feature&gt; 这样。我编辑了答案~

以上是关于Wix - 卸载删除文件但不删除文件夹的主要内容,如果未能解决你的问题,请参考以下文章

WiX 安装程序在卸载时删除文件,但在升级时不删除

Wix 自定义卸载操作 - 如何在 msi 删除文件之前运行

WIX 安装程序,在卸载时,从临时目录中删除文件

卸载时未删除Windows服务(WIX 3)

如何在卸载时立即生成WIX执行命令

卸载后程序文件中存在空目录