Измените местоположение загрузки для Inno Setup TDownloadWizardPage

#inno-setup #pascalscript #inno-setup-v6

Вопрос:

Я использую систему загрузки Inno Setup, но я хотел бы изменить папку загрузки с {tmp} другой, может ли кто-нибудь мне помочь?

от:

 DownloadPage.Add('{#LinkJava}', ExpandConstant('{tmp}Java.exe'), '');
 

для:

 DownloadPage.Add('{#LinkJava}', ExpandConstant('{src}{#PastaGeralDeApps}{#PastaDownPlugins}{#NomeExeJava}'), '');
 

Я создаю автоматический установщик, и мне нужно хранить приложения в папке, чтобы использовать их в автономном режиме.

Ответ №1:

Вы не можете изменить папку, в которую загружаются файлы, используя TDownloadWizardPage (обратите внимание, что BaseName аргумент TDownloadWizardPage.Add принимает только имя файла, а не путь).

Но вы можете скопировать файлы в последнюю папку, как только они будут загружены.

 [Files]
Source: "{tmp}downloaded-file.exe"; DestDir: "{app}"; flags: external
 

Вам, конечно, необходимо загрузить файлы перед фактической установкой. Так , например, из NextButtonClick(wpReady) того, как это делает официальный CodeDownloadFiles.iss пример.


Если вам нужно переместить файлы в конечное расположение перед установкой, используйте RenameFile или FileCopy функции. Копирование, очевидно, происходит медленнее, но более надежно, так как вы не можете перемещать/переименовывать диски/файловые системы. Вы можете попробовать переместиться, вернуться к копированию, если перемещение не удастся.

Комментарии:

1. Я последовал вашему совету и сумел решить эту проблему, создав новую функцию, как вы упомянули, большое вам спасибо 🙂

Ответ №2:

 //function that performs the download - OK
function DownloadFiles(Url, Destination, FileName, Hash : String): Boolean;
begin
    DownloadPage.Clear;    
    DownloadPage.Add(Url, FileName, Hash);     
    DownloadPage.Show;
    try
      try
        DownloadPage.Download;
        Result := True;
      except
        if DownloadPage.AbortedByUser then
          Log('Aborted by user.')
        else
          SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
        Result := False;
      end;
    finally
      FileCopyLogged(ExpandConstant('{tmp}' FileName), ExpandConstant(Destination '' FileName), False);      
    end;
    Result := True;     
end;
 

Комментарии:

1. Подумайте о том, чтобы обратиться к реализации FileCopyLogged и выполнить проверку ошибок там. В целом, возможно, стоит попробовать сначала переместить, а не копировать. Но я понял, что вы копируете на USB-накопитель, поэтому перемещение не может быть успешным. Возможно, вы захотите удалить ненужный файл {tmp} справа после его копирования, вместо того, чтобы ждать, пока Inno Setup сделает это за вас в конце, чтобы не хватало места на диске, если у вас несколько загрузок.