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
相关产品推荐
相关产品推荐

