编译后删除包含文件,Inno Setup为何仍报「无法打开包含文件」警告?
Inno Setup编译时删除包含文件后出现警告的原因及解决办法
问题原因
Inno Setup的编译流程分为预处理器处理和主编译两个核心阶段:
- 预处理器执行
#include时,会把目标文件的内容插入到脚本对应位置,但同时会记录这个包含文件的路径,用于后续的依赖检查、增量编译验证等步骤。 - 你在
#include后立刻用#expr DeleteFile删除了临时文件,当主编译阶段尝试访问这个已被记录的包含文件时,就会因文件不存在触发警告。简单说,不是处理完文件列表后还要打开,而是编译流程的后续步骤需要验证这个文件的存在性。
解决办法
方法1:替换#include为#emit + LoadStringFromFile
使用预处理器的LoadStringFromFile函数读取临时文件内容,再通过#emit直接输出到脚本中。这种方式不会让Inno Setup记录原文件的引用,后续编译步骤不会再尝试访问它。修改后的脚本如下:
[Setup] AppName=InnoTest AppVerName=InnoTest DefaultDirName={commonpf}\InnoTest [Files] #define TempFile SourcePath+'TempFileList.txt' #emit LoadStringFromFile(TempFile) #expr DeleteFile(TempFile)
方法2:延迟删除临时文件
不在脚本内删除临时文件,而是通过外部脚本控制编译流程:
- 先生成
TempFileList.txt - 调用Inno Setup编译脚本
- 编译完成后再删除
TempFileList.txt
比如用批处理脚本:
@echo off rem 生成临时文件列表 echo Source: "D:\foo\test.DE"; DestDir: "{app}"; Flags: ignoreversion > TempFileList.txt echo Source: "D:\foo\test.ES"; DestDir: "{app}"; Flags: ignoreversion >> TempFileList.txt rem 调用Inno Setup编译 ISCC.exe "你的脚本文件名.iss" rem 删除临时文件 del TempFileList.txt
内容的提问来源于stack exchange,提问作者ralfiii
相关产品推荐
相关产品推荐

