Wix RemoveFile and RemoveFolder for removing lefto

2019-07-21 07:53发布

I have following wix file that is supposed to call the Custom Action during the installation. The custom action will create some files required for program. As Wix will only remove only those files that were installed by installer, files created by Custom action will be leftover. So I am resorting to RemoveFile provided by Wix.

I have following Wix File.

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="WixCustomAction" Language="1033" Version="1.0.0.0" Manufacturer="Sarvagya" UpgradeCode="1d77ebdc-2ba2-4b34-b013-7c8a8adcef5b">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"/>

    <Feature Id="ProductFeature" Title="WixCustomAction" Level="1">
        <ComponentGroupRef Id="ProductComponents" />
  <!--<ComponentGroupRef Id="RemoveLeftOvers" />-->
</Feature>
</Product>

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="WindowsVolume">
            <Directory Id="INSTALLFOLDER" Name="LearningWix" />
        </Directory>
    </Directory>
</Fragment>

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
  <Component Id="SomeDLL">
    <File Source="C:\boost_1_55_0_dyn\stage\lib\boost_atomic-vc100-mt-1_55.dll" />
  </Component>
  <Component Id="RemovingFiles">
    <RemoveFile Id="ConfigRemove" Name="lpa.config" On="uninstall"/>
    <RemoveFile Id="LogsRemove" Name="*.log" On="uninstall"/>
    <RemoveFile Id="ProductCodeRemove" Name="productcode.txt" On="uninstall"/>
  </Component>
    </ComponentGroup>    
<Binary Id="SetupCA"  SourceFile="..\LearnCustomAction\bin\Release\LearnCustomAction.CA.dll"/>
<CustomAction Id="FileWrite" Execute="immediate" BinaryKey="SetupCA" DllEntry="WriteFileToDisk" />
<InstallExecuteSequence>
  <Custom Action="FileWrite" Before="InstallFinalize"></Custom>
</InstallExecuteSequence>
</Fragment>

The Custom Action will create files lpa.config and productcode.txt . Apps will create output.log, output.1.log, ... . But during compilation, I get following error

The Component/@Guid attribute's value '*' is not valid for this component because it does not meet the criteria for having an automatically generated guid. Components using a Directory as a KeyPath or containing ODBCDataSource child elements cannot use an automatically generated guid. Make sure your component doesn't have a Directory as the KeyPath and move any ODBCDataSource child elements to components with explicit component guids.

How am I supposed to correctly use RemoveFile for removing the leftovers? I referred to this but no help.

UPDATE

I have fixed the issue by adding a GUID in Component tag. Now when Adding RemoveFolder in above code eg:

    <RemoveFolder Id="LeftOverAppsRemove" On="uninstall" Directory="apps"/>
    <RemoveFolder Id="LeftOverTempRemove" On="uninstall" Directory="temp"/>

I get issue Unresolved reference to symbol 'Directory:apps' in section 'Fragment:'. How do I fix this?

1条回答
【Aperson】
2楼-- · 2019-07-21 08:23

You can only use the RemoveFolder element to remove empty folders, so that won't help much. If you have a CustomAction that creates files in your application directory, I suggest you don't create RemoveFile elements for those. Oftentimes, you're going to create subfolders with disposable data in your application directory and you'd have to create removal elements for every file that is added to the directory. The lazy way to go about this is to make use of the RemoveFolderEx Element. As described on that page, you have to use the Remember property pattern to make this work. Here is an example how to implement these two techniques:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Fragment>
    <ComponentGroup Id="CommonFiles" Directory="INSTALLFOLDER">
        <Component Id="SomeDLL" Guid="PUT-GUID-HERE">
          <File Source="C:\boost_1_55_0_dyn\stage\lib\boost_atomic-vc100-mt-1_55.dll" />
          <util:RemoveFolderEx Id="RemoveAdditionalFiles" On="uninstall" Property="REMOVAL"/>
        </Component>
        <Component>
          <RegistryValue Root="HKCU" Key="SOFTWARE\YOURCOMPANY\YOURPRODUCT" Name="CompleteRemoval" Value="[INSTALLFOLDER]" Type="string"/>
          <RemoveFolder Id="Cleanup" On="uninstall"/>
        </Component>
    </ComponentGroup>
    <Property Id="REMOVAL">
      <RegistrySearch Id="RemovalProperty" Root="HKCU" Key="SOFTWARE\YOURCOMPANY\YOURPRODUCT" Name="CompleteRemoval" Type="raw" />
    </Property>
    <CustomAction Id='SaveCmdLineValue' Property='REMOVAL_CMD'
      Value='[REMOVAL]' Execute='firstSequence' />
    <CustomAction Id='SetFromCmdLineValue' Property='REMOVAL'
      Value='[REMOVAL_CMD]' Execute='firstSequence' />
    <InstallUISequence>
      <Custom Action='SaveCmdLineValue' Before='AppSearch' />
      <Custom Action='SetFromCmdLineValue' After='AppSearch'>REMOVAL_CMD</Custom>
    </InstallUISequence>
    <InstallExecuteSequence>
      <Custom Action='SaveCmdLineValue' Before='AppSearch' />
      <Custom Action='SetFromCmdLineValue' After='AppSearch'>REMOVAL_CMD</Custom>
    </InstallExecuteSequence>
  </Fragment>
</Wix>
查看更多
登录 后发表回答