Search code examples
wixwindows-installer

SourceProperty as Nested Directory in CopyFile


I want to copy two file from existing location to new location using WIX Installer. INSTALLDIR and Destination Directory are already defined. And In SourceProperty for first I want to use INSTALLDIR\P\X\Y and In second I want to use INSTALLDIR\Q\X\Y

<ComponentGroup Id="aYML" Directory="INSTALLDIR">
   <Component Id="CopyaYML" Guid="" Transitive="yes">
     <CopyFile Id ="aYMLcopy" SourceProperty="INSTALLDIR\P\X\Y" SourceName="A.yml" DestinationProperty="Destination"/>
     <CreateFolder/>
   </Component>
</ComponentGroup>
<ComponentGroup Id="bYML" Directory="INSTALLDIR">
   <Component Id="CopybYML" Guid="" Transitive="yes">
      <CopyFile Id ="bYMLcopy" SourceProperty="INSTALLDIR\Q\X\Y" SourceName="B.yml" DestinationProperty="Destination"/>
      <CreateFolder/>
   </Component>
</ComponentGroup>

As \ is not allowed in WIX how to achieve this?


Solution

  • It has to be a property name, which has a limited character set of letters, numbers, and underscores. You could use a SetProperty custom action (type 19) to format a value using the directory ID and the file name, or even the [#fileId] property format, though that's not reliable in older versions of Windows Installer.

    Before InstallFiles but after CostFinalize, you could do something like this:

    <SetProperty Id="AYMLPATH" Before="InstallFiles" Sequence="execute" value="[ParentDirectoryId]A.yml" />
    

    Though, it may be easier to just use the SourceDirectory attribute and specify the directory ID.

    Copying files, though, can cause issues for some servicing scenarios. For example, if you copy files in a patch, the changes can't be rolled back. If the files are small, just duplicate the files. There are even tricks to duplicating the file records, but keeping a single file blob in a CAB, but is outside the scope of this answer.