Inno Setup安装前备份目标文件夹文件报错求助
Inno Setup备份现有配置文件报错的解决方案
错误原因
你在[Files]段里写的备份代码逻辑错误:Inno Setup的Source参数指向的是你打包时的本地安装源文件路径,不是目标电脑上已存在的文件路径。直接用{app}\Controller\Controller.exe.config作为Source,安装程序会在你的打包源目录里找这个文件,自然找不到,所以报“位置不存在”。
[Files]段的作用是复制你打包时准备好的文件到目标机器,不能用来处理目标机器上已有的文件。
正确解决方案
改用[Code]段编写逻辑,在安装新文件前备份目标机器上的旧配置文件,示例代码如下:
完整代码示例
; 原有的[Files]段保留,负责复制新文件 [Files] Source: "{#MyLocalDir}\Controller\bin\Release\*"; \ DestDir: "{app}\Controller"; \ Flags: ignoreversion recursesubdirs createallsubdirs; ; 添加[Code]段处理备份逻辑 [Code] procedure CurStepChanged(CurStep: TSetupStep); var SourceConfigPath, BackupDirPath, BackupConfigPath: string; begin // 在安装文件步骤开始前执行备份 if CurStep = ssInstall then begin SourceConfigPath := ExpandConstant('{app}\Controller\Controller.exe.config'); BackupDirPath := ExpandConstant('{app}\PrevVersion\Controller\'); BackupConfigPath := BackupDirPath + 'Controller.exe.config'; // 先创建备份目录(如果不存在) if not DirExists(BackupDirPath) then ForceDirectories(BackupDirPath); // 如果旧配置文件存在,执行备份(False表示不覆盖已有的备份) if FileExists(SourceConfigPath) then FileCopy(SourceConfigPath, BackupConfigPath, False); end; end;
注意事项
- 选择
ssInstall步骤执行备份,确保在新文件覆盖旧文件前完成备份操作 FileCopy的第三个参数设为False,避免多次安装时覆盖之前的备份文件;如果需要覆盖旧备份,可改为True- 这段逻辑仅在目标机器上已有该配置文件时才会执行备份,首次安装时因为
{app}目录还不存在,不会触发备份,符合预期
内容的提问来源于stack exchange,提问作者puneet
相关产品推荐
相关产品推荐

