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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:40:29