为什么我们在 Inno Setup 的 ExtractTemporaryFiles 函数中指定路径?

Why do we specify the path in ExtractTemporaryFiles function in Inno Setup?

我一直在阅读 Inno Setup 文档,并且对为什么我们在 ExtractTemporaryFiles 函数中指定路径感到困惑,如果根据文档它 提取与指定的通配符匹配的文件从 [Files] 部分到临时目录的模式。?如果我们在 [Files] 部分中有此 Source: "Readme.txt"; Flags: dontcopy 为什么我们在 [Code] 部分中键入 ExtractTemporaryFiles('{tmp}\Readme.txt')?这是一个错误还是我只是不明白这个功能是如何工作的?这同样适用于 ExtractTemporaryFile 过程。

这是来自 ExtractTemporyFile 页面的代码:

[Files]
Source: "Readme.txt"; Flags: dontcopy noencryption

[Code]
function InitializeSetup: Boolean;
var
  S: AnsiString;
begin
  { Show the contents of Readme.txt (non Unicode) in a message box }
  ExtractTemporaryFile('Readme.txt');
  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
  begin
    MsgBox(S, mbInformation, MB_OK);
  end;

  Result := True;
end;

这是来自 ExtractTemporaryFiles 页的代码:

[Files]
Source: "Readme.txt"; Flags: dontcopy
Source: "MyProg.exe"; DestDir: "{app}"
Source: "MyProg.chm"; DestDir: "{app}"

[Code]
function InitializeSetup: Boolean;
var
  S: AnsiString;
  ResultCode: Integer;
begin
  { Show the contents of Readme.txt (non Unicode) in a message box }
  ExtractTemporaryFiles('{tmp}\Readme.txt');
  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
  begin
    MsgBox(S, mbInformation, MB_OK);
  end;

  { Extract all MyProg files and launch it. Note how {app} is left unexpanded. }
  ExtractTemporaryFiles('{app}\MyProg.*');
  ExecAsOriginalUser(ExpandConstant('{tmp}\')+'{app}\MyProg.exe', '', '',
    SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);

  Result := True;
end;

在第一种情况下我们有:

[Files]
Source: "Readme.txt"; Flags: dontcopy noencryption
[Code]
ExtractTemporaryFile('Readme.txt');

在第二个中我们有:

[Files]
Source: "Readme.txt"; Flags: dontcopy
[Code]
ExtractTemporaryFiles('{tmp}\Readme.txt');

这两者有什么区别? (noencryption标志不算) 如果我们已经从那里提取,为什么我们需要在第二种情况下指定 {tmp} 常量?为了能够正确使用这些方法,我需要清楚地理解语法。

你问题的具体答案:

Why do we type ExtractTemporaryFiles('{tmp}\Readme.txt') in the [Code] section?

ExtractTemporaryFiles 示例代码中的 {tmp} 引用显然是 ExtractTemporaryFiles 函数所必需的,尽管这没有记录。 {tmp} 引用不存在于 documentation sample code for the ExtractTemporaryFile procedure:

[Files]
Source: "Readme.txt"; Flags: dontcopy noencryption

[Code]
function InitializeSetup: Boolean;
var
  S: AnsiString;
begin
  // Show the contents of Readme.txt (non Unicode) in a message box
  ExtractTemporaryFile('Readme.txt');
  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
  begin
    MsgBox(S, mbInformation, MB_OK);
  end;

  Result := True;
end;

我能看到 ExtractTemporaryFileExtractTemporaryFiles 之间的唯一区别是:

  1. ExtractTemporaryFile只提取一个文件,没有return值

  2. ExtractTemporaryFiles 根据通配符提取文件名,returns 类型 integer(提取的文件数),显然需要目录名前缀消除正在提取的文件名的歧义(尽管没有记录)

使用ExtractTemporaryFiles(与ExtractTemporaryFile相反),需要使用DestDir参数的完整值(除了文件名)来select文件的正确副本,以防安装程序中有多个同名文件。相反,ExtractTemporaryFile 将始终提取具有给定名称的第一个文件。

所以有了这个:

[Files]
Source: "one\readme.txt"; DestDir: "{app}\one"
Source: "two\readme.txt"; DestDir: "{app}\two"
Source: "three\readme.txt"; Flags: dontcopy
  • 要提取 one\readme.txt,请使用:ExtractTemporaryFiles('{app}\one\readme.txt')
  • 要提取 two\readme.txt,请使用:ExtractTemporaryFiles('{app}\two\readme.txt')
  • 要提取 three\readme.txt,请使用:ExtractTemporaryFiles('{tmp}\readme.txt')
    Flags: dontcopy 出于某种原因暗示 DestDir: {tmp}