You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Inno Setup使用ExtractTemporaryFiles提取到tmp子目录报错咨询

Inno Setup:将临时文件提取到{tmp}子目录的正确方法

完全支持将临时文件提取到{tmp}的子目录,你的报错是因为对ExtractTemporaryFiles函数的用法理解有误。

错误原因分析

你传入ExtractTemporaryFiles('{tmp}\\lic\\Readme.txt')是错误的:该函数的参数是安装包中打包的源文件标识(对应[Files]段的Source项),而非目标路径。Inno Setup找不到匹配这个路径的源文件,因此抛出异常。

解决方法

方法1:直接通过[Files]段配置(推荐)

无需编写代码,直接在[Files]段指定目标子目录,Inno Setup会自动创建所需目录:

[Files]
Source: "\\Mac\Home\Desktop\License\Readme.txt"; DestDir: "{tmp}\lic"; Flags: dontcopy
  • DestDir: "{tmp}\lic" 指定文件提取到{tmp}下的lic子目录
  • Flags: dontcopy 确保文件仅临时提取,不会安装到用户系统

方法2:通过代码手动处理

如果必须用代码控制目录创建和文件移动,可按以下方式修改:

[Files]
Source: "\\Mac\Home\Desktop\License\Readme.txt"; Flags: dontcopy
[Code]
function InitializeSetup: Boolean;
var
  TempLicDir, TempFilePath: String;
begin
  TempLicDir := ExpandConstant('{tmp}\lic');
  // 创建子目录
  if not DirExists(TempLicDir) then
    CreateDir(TempLicDir);
  
  // 先将文件提取到默认临时目录({tmp}根目录)
  ExtractTemporaryFiles('Readme.txt');
  TempFilePath := ExpandConstant('{tmp}\Readme.txt');
  
  // 移动文件到目标子目录
  if FileExists(TempFilePath) then
  begin
    FileCopy(TempFilePath, TempLicDir + '\Readme.txt', False);
    // 可选:删除原临时文件
    DeleteFile(TempFilePath);
  end;
  
  Result := True;
end;

补充说明

对于你需要的完整目录结构(tmp\App.exe、tmp\lic\readme.txt、tmp\cfg\configfile.txt),都可以用方法1批量配置:

[Files]
Source: "路径\App.exe"; DestDir: "{tmp}"; Flags: dontcopy
Source: "路径\License\Readme.txt"; DestDir: "{tmp}\lic"; Flags: dontcopy
Source: "路径\cfg\configfile.txt"; DestDir: "{tmp}\cfg"; Flags: dontcopy

这种方式最简洁,无需额外代码,Inno Setup会自动处理所有目录创建和文件提取。

内容的提问来源于stack exchange,提问作者Mear1628

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:42:52