title: INNO setup extract dir tree when setup starts prior to install
body: <p>I have an INNO setup program that works like a charm.  Now I need to add in a theme option pre-install for the user to select the theme for the application.  These themes are defined in a deployment directory that gets copied to the {tmp} folder on install.</p>
  
  <p>What I am trying to do is look in this directory section for particular directories/files to determine the theme options.  When I find a theme, I will then add an option to a combo box for the user to select.  This selection will then affect the installation of the application (also from the {tmp} area).</p>
  
  <p>My problem is that the files are not extracted to the {tmp} directory until the install button is clicked.  Is there a way to peek into the compressed file structure or force these files to the {tmp} directory prior to install?  The file structure is different for each of the themes and based on the customer only certain themes are available.</p>
  
  <p>I have used the ExtractTemporaryFile method before, but I do not know what themes exist at runtime until the directory is extracted.  It would be nice to be able to extract an entire directory tree, but I am not finding an easy way to do this.</p>
  
  <p>Thanks for your help.</p>
  
  <p>The following is an example script of what I was originally trying to do:</p>
  
  <pre><code>[Setup]
  AppName=Test
  AppVersion=1.5
  DefaultDirName={pf}\test
  OutputDir=Output
  OutputBaseFilename=tt
  DisableReadyPage=false
  
  [Files]
  ;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme1; Flags: ignoreversion replacesameversion
  ;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme2; Flags: ignoreversion     replacesameversion
  ;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme3; Flags: ignoreversion replacesameversion
  ;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme4; Flags: ignoreversion replacesameversion
  Source: App\*.*; DestDir: {tmp}\App; Flags: ignoreversion replacesameversion recursesubdirs createallsubdirs
  Source: readme.txt; DestDir: {app}; Flags: ignoreversion replacesameversion
  
  [Run]
  
  [Code]
  
  var
     curDir : String;
     TestPage : TWizardPage;
     ThemeComboBox: TNewComboBox;
  
  procedure InitializeWizard;
  begin
     TestPage := CreateCustomPage(wpSelectTasks, 'My test page', 'run test');
  
     // create the theme combo box
     ThemeComboBox := TNewComboBox.Create(TestPage);
     ThemeComboBox.Name := 'themeselection';
     ThemeComboBox.Width := TestPage.SurfaceWidth;
     ThemeComboBox.Parent := TestPage.Surface;
     ThemeComboBox.Style := csDropDownList;
  end;
  
  function NextButtonClick(CurPageID: Integer): Boolean;
  var
     ThemeDir: String;
  begin
     Result := True;
  
     if CurPageID = wpSelectDir then
     begin
        // look for the networks and then add the ones that exist to the combo box
        ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\tmeme1');
        MsgBox(ThemeDir, mbInformation, MB_OK);
        if DirExists(ThemeDir) then
        begin
           // populate the combo box
           // this is theme1 so it is Standard
           ThemeComboBox.Items.Add('Standard');
        end;
  
        ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\theme2');
        if DirExists(ThemeDir) then
        begin
           // populate the combo box
           ThemeComboBox.Items.Add('theme2');
        end;
  
        ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\theme3');
        if DirExists(ThemeDir) then
        begin
           // populate the combo box
           ThemeComboBox.Items.Add('theme3');
        end;
  
        ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\theme4');
        if DirExists(ThemeDir) then
        begin
           // populate the combo box
           ThemeComboBox.Items.Add('theme4');
        end;
     end;
  end;
  </code></pre>